【问题标题】:Rails associations using an array as the foreign_idRails 关联使用数组作为 foreign_id
【发布时间】:2019-06-01 18:38:43
【问题描述】:

我希望创建一个关联,其中模型可以由三个不同的实体创建和拥有,但也可以引用其他两个实体。

例如,我有一个 performance 模型,其中三种不同类型的模型可以创建性能:venueartist乐队。但是,表演还需要参考其他两个,例如,如果场地创建表演,则需要列出将要表演的艺术家或乐队。如果艺术家创作表演,那么艺术家需要在他/她将要表演的地方放置一个场地。

所以我从这样的事情开始:

class CreatePerformances < ActiveRecord::Migration[6.0]
  def change
    create_table :performances, id: :uuid do |t|
      t.belongs_to :venue, index: true
      t.belongs_to :artist, index: true
      t.belongs_to :band, index: true
      t.timestamps
    end
  end
end

但是,如果场地所有者创建了一个表演并有两个单独的乐队表演,那么我需要在 band_id 列中有一组乐队。但是当我这样做时 (t.belongs_to :band, type: :uuid, array: true, default: [], index: true) 并在 band_id 数组中添加一个波段,然后执行 band.performances 我得到:ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR: malformed array literal:

我可以将关联列设置为数组,并且仍然能够使用 Rails 关联功能,或者这是不可能的,甚至是不好的做法,如果可以,该怎么做?

另外,我正在使用 postgresql,如果您有更优雅的方式来执行上述操作,我将不胜感激。

【问题讨论】:

    标签: ruby-on-rails postgresql associations


    【解决方案1】:

    我想最好使用 has_many 关系。

    如果一场演出可以有很多乐队演奏,那么它就不是“属于”一个乐队,而是“有很多”乐队。

    因此,您可以在表演和乐队之间使用“拥有并属于许多”或“拥有许多:通过”的关系。在此处查看差异https://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many

    两者中最容易配置的是HABTM:

    class Band
      has_and_belongs_to_many :performances
    
    class Performance
      has_and_belongs_to_many :bands
    

    你需要一张桌子,所以添加一个这样的miration:

    create_table :bands_performances, id: false do |t|
      t.references :band, index: true
      t.references :performance, index: true
    end
    

    https://guides.rubyonrails.org/association_basics.html#creating-join-tables-for-has-and-belongs-to-many-associations

    查看指南,如果您需要额外的字段,您可能需要一个连接模型并使用 has_many :through。你比任何人都更了解上下文。

    【讨论】:

    • 这是一个很好的答案,应该很可能会被接受,但是请记住,has_many :through 基本上已经取代了has_and_belongs_to_many
    • @MarkMerritt 这不是我第一次读到有人说 HMT 取代了 HABTM,但我找不到任何官方声明。官方的 Rails 指南显示了这两个选项,并带有一个特定部分,说明您何时可能更喜欢其中一个。我知道 HMT 可以处理 HABTM 的相同用例等等,我已经把它放在我的回答中,但我从来没有读过官方说在每个案例上应该更喜欢 HMT 而不是 HABTM。你对此有什么参考吗?
    • @MarkMerritt 我不认为这意味着它是官方的(它只是一本着名的书,特别是在 Rails 1.1 发布时从博客中引用,文档没有反映该声明) ,在此之前,在has_and_belongs_to_many 部分它说在rails 指南指出的情况下使用HABTM 很好(如果关联不需要额外的属性)。我认为说一个人不应该在任何情况下使用 HABTM 因为 HMT 替换 它具有误导性,它们在不同的上下文中都是有效的(这就是我放置最后一个链接的原因根据我的回答)
    • @MarkMerritt 它是相关的,阅读“HMT 基本上取代了 HABTM”的人可能认为他应该永远使用 HABTM,但文档明确指出你可以很好地使用它在一些简单的场景中。我看到的唯一好处是它更容易为初学者配置(不需要显式的 jon 模型)。无论如何,就像我在回答中所说的那样,我建议这两种选择,因为我不知道上下文并提供了阅读差异的链接,我并不是说有人应该使用其中一种。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2012-03-24
    • 2016-07-03
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多