Reputation: 111
I've been grappling with a problem which is proving to be quite hard. I've got a User model, a Photo model and a comment model. Now the way my website works is that a User can have many comments on a particular photo. On the reverse side, a comment can only belong to a particular user on a particular photo.
I've read through the Active Record Associations docs and from what I've gathered is that we can't use a has_many :through
associations since it appears to work for polymorphic associations between models. I'm wondering if one can use has_many :through
association on one side and belongs_to
association on the reverse side.
Any tips, pointers and advice? I'm just beginning in Ruby on Rails
Thanks.
Upvotes: 1
Views: 35
Reputation: 76774
#app/models/user.rb
class User < ActiveRecord::Base
has_many :photos
has_many :comments, through: :photos #-> probably won't work but I'd try it first
end
#app/models/photo.rb
class Photo < ActiveRecord::Base
belongs_to :user
has_many :comments do
def current_user #-> photo.comments.current_user
where user_id: self.user_id
end
end
end
#app/models/comment.rb
class Comment < ActiveRecord::Base
belongs_to :photo
belongs_to :user
end
--
You could access the photo's comments as follows:
<% @user.photos.each do |photo| %>
<%= photo.comments.each do |comment| %>
<%= comment %>
<% end %>
<% end %>
If you wanted to show only the user's comments, you'd be able to use the current_user
ActiveRecord Association Extension:
<% @user.photos.each do |photo| %>
<%= photo.comments.current_user.each do |comment| %>
<%= comment %> #-> comments where user_id will be the same as photo's user_id
<% end %>
<% end %>
Upvotes: 1
Reputation: 3231
You can do it like this:
User
has_many :comments
Photo
has_many :comments
belongs_to :user
Comment
belongs_to :user
belongs_to :photo
Upvotes: 0
Reputation: 2390
Wouldn't this work?
class User
has_many :photos
has_many :comments
end
class Photo
belongs_to :user
has_many :comments
end
class Comment
belongs_to :user
belongs_to :photo
end
User has many photos and comments (the ones he uploaded/written), and each comment belongs to user (writer) and a photo which was commented on.
Upvotes: 2