has_many:没有连接表

时间:2013-06-10 20:29:56

标签: ruby-on-rails activerecord associations

我正在查看一些设置User模型的示例Rails代码:

has_many :posts, :foreign_key => :author_id
has_many :comments, :foreign_key => :author_id
has_many :post_feedback, :through => :posts, :source => :comments

虽然我可以了解这是做什么的,但我无法在Rails文档中找到此功能的示例,这似乎表明has_many :through关联始终需要连接表。

是否有经验法则我可以应用于不需要连接表的情况?

2 个答案:

答案 0 :(得分:2)

如果您认为不需要加入模型,则可以使用has_and_belongs_to_many执行此操作。但是您仍然需要数据库中的连接表。没有办法解决这个问题,因为这是建模与RDBMS的多对多关系的唯一方法。

如果您认为联接表不合理,那么您可能拥有一对多或一对一的关系,可以使用belongs_tohas_one进行配置,但这样听起来不像你的情况。

答案 1 :(得分:1)

我最初没有为适当的上下文发布足够的代码,但事实证明这是has_many :through, :source习惯用(通过Rails文档的话)“通过嵌套has_many设置'快捷方式'的示例协会“。

class Post < ActiveRecord::Base
  belongs_to :author, :class_name => "User"
  has_many :comments, :foreign_key => :post_id
end

class Comment < ActiveRecord::Base
  belongs_to :author, :class_name => "User"
  belongs_to :post
  belongs_to :parent, :class_name => "Comment", :foreign_key => "parent_comment_id"

  has_many :replies, :class_name => "Comment", :foreign_key => "parent_comment_id"
end

class User < ActiveRecord::Base
  has_many :posts, :foreign_key => :author_id
  has_many :comments, :foreign_key => :author_id
  has_many :post_feedback, :through => :posts, :source => :comments
end

:post_feedback只是嵌套关联的自定义名称(:comments已被使用),而:source正在使实际关联显式化。现在,Rails会理解User.post_feedback并返回给定CommentUser的所有Post,包括她自己的{{1}}。