看似冗余的ActiveRecord has_many定义

时间:2010-10-13 10:31:19

标签: ruby-on-rails activerecord has-many-through

我一直在将has and belongs to many样式关联应用于我一直在研究的项目,但是因为我想在我的连接模型中捕获额外的信息,所以我通过更精细的{隐式设置它{1}} / belongs_to代替has_many。在最初磕磕绊绊之后,我了解到我在我的模型User中需要这两个定义(在Show model对应物中也是如此):

has_and_belongs_to_many

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

因此,它不仅有助于在您的示例中通过或多或少的连接表(两个外键,时间戳,也可能是一个或两个属性) - 您可以拥有使用has_many :through的大型模型上。

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