I’m building a blog application that allows users to create and edit
blog posts. I want to add the ability for a user to check a box on
the post page that enables an alert on the post that sends an email to
the user when the post is updated.
I would think my alerts table would simply consist of a user_id, a
post_id and a created_at timestamp. So in modeling the associations
for this, my first thought was that this would be a has_many :through
association but I’m not sure how or where I would make that
association.
Is this thought process on the right path? Thanks for any help.
class Post < ActiveRecord::Base
belongs_to :creator, :class_name => “User”, :foreign_key =>
“created_by”
has_many :alerts, :dependent => :destroy
end
class User < ActiveRecord::Base
has_many :created_posts, :class_name => “Post”, :foreign_key =>
“created_by”
has_many :alerts, :dependent => :destroy
end
class Alert < ActiveRecord::Base
belongs_to :post
belongs_to :user
end
Yeah, another user can update somebody’s post but I don’t think that
even matters in this case (think of this as having multiple admins
editing posts). The alerts table still needs to connect both the user
and the post so that a user other than the user that created the post
can enable an alert on the post.
With that said, is this still a has_many :through or will my original
design work? Thanks again.
You’re on the right track - the :through part comes in when you want
to go directly from Post to User. The following associations will do
what you’re looking for:
on Post
has_many :alert_users, :through => :alerts, :source => :user
on User
has_many :alert_posts, :through => :alerts, :source => :post
(you may need some extra :class_name noise, but I think this will
work)
Then, given a post @post, you can get all the users receiving alerts:
@post.alert_users
or all the posts a user @user is being alerted about:
@user.alert_posts
–Matt J.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.