Ankit Kulshrestha
Ankit Kulshrestha

Reputation: 111

Modelling nested models in rails

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

Answers (3)

Richard Peck
Richard Peck

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

Gokul
Gokul

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

Piotr Kruczek
Piotr Kruczek

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

Related Questions