【问题标题】:Various belongs_to many associations各种属于_许多协会
【发布时间】:2014-02-02 04:02:36
【问题描述】:

我找到了很好的答案 hereherehere,但我无法将其概括为我所追求的。

我有多个类别,这些类别将被策划和选择。因此,用户将能够选择 cat1、cat2 和 cat3,但不能键入自定义类别。

一个类别可以有很多帖子,一个帖子可以有很多类别。
一个帖子可以有多个 cmets。
一个用户可以有很多帖子和很多 cmets。

对于帖子/类别关系,我认为这会起作用,但用户/帖子/评论关系是我摸不着头脑的地方......

# 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

这看起来很接近吗?我需要任何外键来处理这一切吗?在此先感谢,我确信这很简单,但我的理解中缺少一些明显的东西。

然后我不得不担心如何为所有这些编写测试!不过那是另一天...

编辑:我应该指出,我还没有开始。只是在开始之前尝试将其映射出来,因此它应该可以简化事情,减少迁移等。

再次编辑:到目前为止已实施建议的更改。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 belongs-to model-associations


    【解决方案1】:

    为什么不先从规格开始?使用 rspec 拥有的所有功能在 Rails 上是一个很好的实践

    你的 Item 应该叫 Post,为什么是 Item?有什么理由吗?如果您想将其称为“项目”,则需要在关联中指定它

    belongs_to :post, class_name: 'Item'
    

    但你最好用 Post 而不是 Item

    评论属于用户,因此用户 has_many :cmets,您不需要 ", through: :posts" 部分

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

    这取决于您,您需要对 CategoriesPosts 进行额外的操作吗? (类别,复数)如果没有,只需使用 has_and_belongs_to_many

    真的,我建议您从规范开始,您最终会得到实现而不用想太多,然后您已经对其进行了测试,然后您可以添加更多规范并对其进行重构。读一些关于 TDD 和 BDD 的东西,一开始很难,但是当你得到它时真的很好。

    【讨论】:

    • 规格,是的,我打算先做规格。我正在为这个项目计划 TDD,但我现在只是想弄清楚关系。项目/帖子,是的,这是一个错字。固定的!阅读它,我认为我不需要任何额外的东西,所以 has_and_belongs_to 应该可以工作。我想我想多了。
    【解决方案2】:

    除了实际命名 Item Post 之外,我认为我会对此做出的唯一更改将在您的用户模型上:

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

    你不需要一个直通关联。您可以将其他作用域 cmets 添加为 comments_on_my_posts, through: :posts, class_name: "Comment" 之类的东西,但对于 cmets 的上述关联,它应该是直接的(评论者 评论)。

    【讨论】:

    • 我认为我不需要那些范围内的 cmets,因为无论如何我只会在帖子下方显示带有用户名和时间戳的 cmets。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多