Hi,
I am stuck trying to figure out how to model this.
I have a user model and an article model.
It is easy enough to say the user has many articles and the article
has one user.
class User < ActiveRecord::Base
has_many :articles
end
class Article < ActiveRecord::Base
belongs_to :user
end
But how do I add the concept of an article having many readers? The
readers would be using the same User model since a User can author
many articles but can also be reading many other articles.
Your help would be most appreciated.
Thanks,
Frank
Well I’m certain this isn’t a working answer, I thought I’d post
anyways in hopes that maybe something I say here will jump start your
brain, and ultimately lead you to the solution. None of this code was
tested.
#This one just uses habtm to make a join table for readers/reads
class User < ActiveRecord::Base
has_many :articles
has_and_belongs_to_many :reads, :class_name => ‘Article’
end
class Article < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :readers, :class_name => ‘User’
end
This one makes the join table explicitly and tries to use some fancy
has_many options.
The :source-'s might be flipped, I’m not sure how those work
exactly. Again this code
isn’t tested, I just read through
and came up with the best thing I could.
class User < ActiveRecord::Base
has_many :articles
has_many :readings, :through => :reads, :source => :user
end
Read as in ‘that was a good read(noun)’, NOT ‘he read(verb) well’.
Helps me to wrap my head around it better.
class Read < ActiveRecord::Base
belongs_to :user
belongs_to :article
end
class Article < ActiveRecord::Base
belongs_to :user
has_many :readers, :through => :reads, :source => :article
end
Again I can’t stress enough that I do not know at all if this will
work, so if your messing with it and you don’t possibly see how it
could work, it probably doesn’t. Move on an find an answer from
someone more experienced (I have less than 6 months exp. in Rails/
Ruby, and use it much more as a hobby, and not a profession).
I’d suggest a join class called ‘Subscription’ that belongs_to :user
and :article. With that you could also add some helpful attributes to
the join (e.g., ‘can_reply’, or ‘last_read_at’). If you add that then
User
has_many :articles
has_many :subscriptions
has_many :articles_to_read, :class_name=>‘Articles’,
:through=>subscriptions
end
Article
belongs_to :user
has_many :subscriptions
has_many :readers, :class_name=>‘User’, :through=>:subscriptions
end