我有Order
,其中有许多line_items
。只有这不是LineItem
模块,而是“可订购的事物”列表。例如。 Addon
或Site
。
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
- 关系来与列表一起使用
不同的模特。
答案 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用于Addon
和Site
模型,但这在我看来并不是很有意义。