Ruby on rails 看似多余的ActiveRecord有很多定义

Ruby on rails 看似多余的ActiveRecord有很多定义,ruby-on-rails,activerecord,has-many-through,Ruby On Rails,Activerecord,Has Many Through,我一直在将拥有并属于许多风格的关联应用到我一直在从事的一个项目中,但是因为我想在我的加入模型中捕获额外的信息,我正在通过更复杂的属于/拥有许多方法来隐式地设置它,而不是拥有且(你属于)许多。在最初无意中了解到这一点后,我了解到我需要在模型用户中使用这两个定义(在Show模型对应项中也是如此): 一切正常,我的问题更多的是关于Rails语法的设计,因为我想确保我没有错过这里的大局:为什么第一个是必需的?如果我们确定用户可以通过中间名为saved\u shows的非标准名称访问节目列表,为什么还要建

我一直在将
拥有并属于许多
风格的关联应用到我一直在从事的一个项目中,但是因为我想在我的加入模型中捕获额外的信息,我正在通过更复杂的
属于
/
拥有许多
方法来隐式地设置它,而不是
拥有且(你属于)许多
。在最初无意中了解到这一点后,我了解到我需要在模型用户中使用这两个定义(在Show模型对应项中也是如此):

一切正常,我的问题更多的是关于Rails语法的设计,因为我想确保我没有错过这里的大局:为什么第一个是必需的?如果我们确定用户可以通过中间名为
saved\u shows
的非标准名称访问节目列表,为什么还要建立
has\u many:saved\u shows


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

Rails使用
:through
选项引用您已经定义的另一个关联。我认为它可以做到这一点,这样您就可以首先清晰地设置复杂的关联,而无需在同一行中定义和引用它们

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

没有干净的方式将所有这些信息内联表达

此外(不确定您的问题中是否暗示了这一点),您可以直接显式访问这两个关联。因此,如果一个用户
有许多:任务
,并且
有许多:里程碑,:通过=>:任务
,那么您可以并且将希望同时访问
@user.tasks
@user.millements

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


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

这很有道理。我还没有像你的例子中提到的那样考虑更复杂的场景,因为我早期的应用程序还不需要它们。
has_many :saved_shows
has_many :shows, :through :saved_shows
has_many :users, :class_name => 'Person', :foreign_key => 'owner_id'
has_many :tasks, :through => :users, :class_name 'Job'