我正在查看一些设置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
关联始终需要连接表。
是否有经验法则我可以应用于不需要连接表的情况?
答案 0 :(得分:2)
如果您认为不需要加入模型,则可以使用has_and_belongs_to_many
执行此操作。但是您仍然需要数据库中的连接表。没有办法解决这个问题,因为这是建模与RDBMS的多对多关系的唯一方法。
如果您认为联接表不合理,那么您可能拥有一对多或一对一的关系,可以使用belongs_to
和has_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
并返回给定Comment
个User
的所有Post
,包括她自己的{{1}}。