我一直在将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需要这个看似多余的定义。它只是一个选择不当的语法还是背后有更深层次的设计?
答案 0 :(得分: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.tasks
和@user.milestones
。
因此,它不仅有助于在您的示例中通过或多或少的连接表(两个外键,时间戳,也可能是一个或两个属性) - 您可以拥有使用has_many :through
的大型模型上。
这有助于回答您的问题吗?不知道你已经知道了多少。