复杂的ActiveRecord关联定义

时间:2010-07-27 13:55:49

标签: ruby-on-rails activerecord associations

如何使用ActiveRecord映射虚线关联?有没有ActiveRecord方式呢?我想要的是获得特定商品的所有独特促销。

Diagram

这是我想的事情,但我不喜欢:

使用自定义查找程序

class Item < ActiveRecord::Base
  has_many :promotions, :finder_sql => "SELECT..FROM promotions..purchase_option_id IN (...)"
end

肮脏而低效但红宝石的方式

my_item.purchase_options.map(&:promotion).uniq

打破PurchaseOption&lt; - &gt; Promotion HABTM关联并为Item&lt; - &gt; PromotedPurchaseOption 创建新关联

class Item < ActiveRecord::Base
  has_many :promoted_purchase_options
  has_many :promotions, :through => :promoted_purchase_options
end

其他想法

我不认为使用命名范围或定义新的方法是个好主意 如果使用它们,这不会简单地工作或执行效率低下的查询:

Item.first.promotions.count
Item.first.promotions.available
Promotion.first.items.all

2 个答案:

答案 0 :(得分:2)

也许这一个:

class Item < ActiveRecord::Base
  has_many :purchase_options
  has_many :promotions, :through => :purchase_options, :uniq => true
end

答案 1 :(得分:0)

我不知道你为什么反对命名范围或自定义方法。这些东西可以通过封装大量的查询逻辑来帮助降低复杂性。尽可能避免在你的人际关系中使用自定义finder_sql。

如果您使用的是不推荐使用的has_and_belongs_to_many关系方法,则应该将其切换为直接连接模型。 has_many ...,:through方法将为您提供对模型之间链接的更多控制,您可以直接更改连接模型的属性。