如何建立一个包含各种模型列表的has_many-like组合?

时间:2014-01-07 14:35:01

标签: ruby-on-rails activerecord

我有Order,其中有许多line_items。只有这不是LineItem模块,而是“可订购的事物”列表。例如。 AddonSite

class Order
  attr_accessor :line_items
  before_save :persist_line_items

  private
  def persist_line_items
    @line_items.each {|li| li.save }
  end
end

class Addon
  belongs_to: order
end
class Site
  belongs_to: order
end

可以用作:

order = Order.new
order.line_items << Addon.new(order: order)
order.line_items << Site.new(order: order)

但是,现在我想加载一个Order并加入“关联的”line_items。一世 可以在after_initialize钩子中加载它们,然后执行 Addon.find_by(order_id: self.id)但很快就会导致很多 查询;其中JOIN更合适。另外,我 目前错过了验证的方法:正常has_many 相关项目无效,包含的模型也无效:

order = Order.new(line_items: [an_invalid_line_item])
order.valid? #=> false

我想知道是否有办法 利用ActiveRecords的has_many - 关系来与列表一起使用 不同的模特。

1 个答案:

答案 0 :(得分:2)

我认为polymorphic association应该可以解决问题。

看起来像这样:

class Order < ActiveRecord::Base
  has_many :line_items
end

class LineItem < ActiveRecord::Base
  belongs_to :orderable, polymorphic: true
end

class Site < ActiveRecord::Base
  has_many :line_items, as: :orderable
end

class Addon < ActiveRecord::Base
  has_many :line_items, as: :orderable
end

它会使用连接表,但我认为这实际上是一件好事。否则,您可以将STI用于AddonSite模型,但这在我看来并不是很有意义。