【问题标题】:Rails STI with HBTM relationsRails STI 与 HBTM 关系
【发布时间】:2013-12-16 18:23:57
【问题描述】:

所以,我有一个这样的 STI 组织:

class Parent
end

class Son < Parent
end

class Daughter < Parent
end

但是每个孩子都有一个与不同模型的 HBTM(has_and_belongs_to_many) 关系。让我们称它为 Chick and Dude,所以它看起来像这样:

class Parent
end

class Son < Parent

  has_and_belongs_to_many :chicks

end

class Daughter < Parent

  has_and_belongs_to_many :dudes

end

我应该在哪里声明关系?都在父模型?它需要任何额外的选择吗? Rails 会在它自己应该为 null 的情况下将其设为 null 吗?

我一直在寻找这个问题的答案,但找不到它,可能是因为它太笨了。


编辑

正如 Peter Alfvin 所提到的,HBTM 关系必须伴随着一个辅助连接表。这意味着此配置将需要两个连接表。

但是,我没有找到任何关于应该在这个非常具体的示例中使用的命名法的文档。

连接表应该包含数据库表的名称​​'parents'或模型的名称​​'daughters'

引用 STI 的 id 列也会出现同样的问题,应该以数据库表命名还是模型命名?

【问题讨论】:

    标签: ruby-on-rails has-and-belongs-to-many sti


    【解决方案1】:

    我相信你的表达是正确的。您不希望在父级别使用它,因为每个子类都与不同的类相关联。

    我不知道您所说的“使列为空”是什么意思。 HABTM 关系的引用表中没有列。 HABTM 关联假定每个 HABTM 模型对都有一个单独的连接表,并且只有在关联模型的实例之间建立关系时才会在该表中创建记录。

    有关连接表的说明,请参阅 http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

    【讨论】:

    • 哦,我的连接表是对的,我的错误。您能否分享一些有关它在数据库层中的外观的知识?我会把这个添加到问题中
    【解决方案2】:

    据我所知,它的工作方式就像每个 STI 子类都有自己的表(尽管在数据库中它们使用相同的表,以它的父类命名)。因此,在 HBTM 连接表中,您应该使用 ID 和表名来引用“虚幻”子表。 迁移看起来是这样的:

    create_table :daughters_dudes, id: false do |t|
      t.belongs_to :daughter
      t.belongs_to :dude
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多