3

我一直在将has and belongs to many样式关联应用到我一直在从事的项目中,但是因为我想在我的连接模型中捕获额外的信息,所以我通过更精细的belongs_to/has_many方法而不是has_and_belongs_to_many. 在最初偶然发现这一点之后,我了解到我在我的模型 User 中需要这两个定义(在 Show 模型对应项中也是如此):

has_many :saved_shows
has_many :shows, :through :saved_shows

一切正常,我的问题更多是关于 Rails 语法的设计,因为我想确保我不会错过这里的大局:为什么第一个是必要的?如果我们要确定用户可以通过具有非标准名称的中间人访问节目列表saved_shows,为什么还要创建has_many :saved_shows

我猜我不是第一个遇到这个问题的人,所以我很好奇为什么 Rails 需要这个看似多余的定义。它只是一个选择不当的语法还是背后有一些更深层次的设计?

4

1 回答 1

3

Rails 使用该:through选项来引用您已经定义的另一个关联。我认为这样做是为了让您可以首先干净地设置复杂的关联,而无需定义它们并在同一行中引用它们。

例如,考虑这个(不必要的复杂)示例:

has_many :users, :class_name => 'Person', :foreign_key => 'owner_id'
has_many :tasks, :through => :users, :class_name 'Job'

没有简洁的方法可以内联表达所有这些信息。

此外(不确定您是否在问题中暗示这一点),您可以直接显式访问这两个关联。因此,如果用户has_many :tasks, 和has_many :milestones, :through => :tasks,您可以并且想要同时访问@user.tasksand @user.milestones

因此,它不仅对浏览示例中或多或少的连接表有用(两个外键、时间戳,可能还有一个或两个属性)——您可以拥有使用的大型模型has_many :through

这有助于回答你的问题吗?不知道你已经知道了多少。

于 2010-10-13T11:02:27.600 回答