【问题标题】:Ruby on rails - ActiveModel association with arrayRuby on rails - ActiveModel 与数组的关联
【发布时间】:2016-06-13 22:14:40
【问题描述】:

我正在构建一个 RoR 应用程序 这是我原来的场景:

2 种模型,Clienti 和 Interventi

class Clienti < ActiveRecord::Base
has_many :interventi, :dependent => :destroy, :foreign_key => "cliente_id"
......
end

class Interventi < ActiveRecord::Base
belongs_to :clienti, :foreign_key => "cliente_id"
.........
end

这是一个简单的一对多关系,每个“clienti”都有很多“interventis”(iterventi 是我应用中的一种工作)。

今天我需要将这种关系从一对多转换为多对多,每个“interventi”需要有多个“clienti”,所以我认为我必须更改“cliente_id”列DB 从 int 到 text 并存储“Clienti's ids”数组(这是好方法吗?)

我的问题是:如果这是好方法,我怎样才能保持模型中的关联,以便我仍然可以使用“Clienti.Interventi.count”之类的东西?

谢谢大家!

【问题讨论】:

  • 您将不得不制作第三个模型来建立多对多关系。如果您阅读官方 Rails 指南,您将拥有设置它所需的内容。 guides.rubyonrails.org/association_basics.html
  • Rails 解决这个问题的方法是在两者之间添加一个新模型,用作连接表(将来可能会有其他属性)。如果你能想出一个好名字,就用那个。如果没有,请使用ClientiInterventi。它将同时属于 Clienti 和 Interventi; C + I will have_many ClientiInterventi.

标签: ruby-on-rails arrays activerecord activemodel


【解决方案1】:

您需要一个连接模型来执行这种多对多关联。按照惯例,你可以称它为clienti_interventi

class Clienti
  has_many :clienti_interventis
  has_many :interventis, through: :clienti_interventis
end

class Interventi
  has_many :clienti_interventis
  has_many :clientis, through: :clienti_interventis
end

class ClientiInterventi
  belongs_to :clienti
  belongs_to :interventi
end

通过此设置,您可以继续做您正在做的任何事情,以及Clienti.first.interventis.countInterventi.first.clientis.count

【讨论】:

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