2

我正在查看一些设置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关联始终是必需的。

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

4

2 回答 2

1

如果您觉得不需要连接模型,可以使用has_and_belongs_to_many. 但是您仍然需要数据库中的连接表。没有办法解决这个问题,因为这是用 RDBMS 建模多对多关系的唯一方法。

如果您觉得没有必要使用连接表,那么您可能有一对多或一对一的关系,可以使用belongs_toand进行配置has_one,但这听起来不像您的情况。

于 2013-06-10T21:41:26.100 回答
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给定Users上的所有Posts,包括她自己的。

于 2013-06-13T02:01:42.460 回答