Question

I've found good answers here, here, and here but I'm having trouble generalizing that to what I'm after.

I have multiple categories, that will be curated and selectable. So, users will be able to select cat1, cat2, and cat3, but not type a custom category.

A category can have many posts, a post can have many categories.
A post can have many comments.
A user can have many posts, and many comments.

For the post/category relationship, I'm thinking this will work, but the user/post/comment relationship is where I'm scratching my head...

# app/models/category.rb
class Category < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

# app/models/post.rb
class Post < ActiveRecord::Base
  has_and_belongs_to_many :categories
  belongs_to :user
  has_many :comments
end

# app/models/user.rb
class User < ActiveRecord::Base
 has_many :posts
 has_many :comments
end

# app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

Does this look close? Do I need any foreign keys anywhere to handle all this? Thanks in advance, I'm sure this is simple and I'm missing something obvious in my understanding.

And then I have to worry about how to write the tests for all this! That's for another day though...

EDIT: I should point out, I haven't started this yet. Just trying to map it out before I start, so it should simplify things, fewer migrations, etc.

EDIT AGAIN: Implemented suggested changes so far. Thanks!

Was it helpful?

Solution

why not start with the specs first? is a good practice on rails with all the power you have with rspec

Your Item should be called Post, why Item? is there any reason? if you want to call it "Item" you need to specify that on the associations

belongs_to :post, class_name: 'Item'

but you are better with Post instead of Item

A comment belongs to a user so the the user has_many :comments, you don't need the ", through: :posts" part

has_many :category_posts
has_many :posts, :through => :category_posts #or would has_and_belongs_to_many work better?

this depends on you, you need extra behavior on the CategoriesPosts? (Categories, in plural) if not, just use has_and_belongs_to_many

Really, i would suggest you start with the specs, you will end up with the implementations without thinking it too much and then you already have it tested and then you can add more specs and refactor it. Read something about TDD and BDD, it's hard at first but it's really good when you get it.

OTHER TIPS

The only change I think I would make to this, other than actually naming Item Post, would be on your user model:

# app/models/user.rb
class User < ActiveRecord::Base
 has_many :posts
 has_many :comments
end

You don't need a through association there. You could add other scoped comments to be something like comments_on_my_posts, through: :posts, class_name: "Comment", but for the above association on comments, it should be direct (commenter <=> comment).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top