如何使用ActiveRecord映射虚线关联?有没有ActiveRecord方式呢?我想要的是获得特定商品的所有独特促销。
这是我想的事情,但我不喜欢:
使用自定义查找程序
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
答案 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方法将为您提供对模型之间链接的更多控制,您可以直接更改连接模型的属性。