我有这两个模型:
class Promotion < ActiveRecord::Base
belongs_to :product
end
class Product < ActiveRecord::Base
has_many :promotions
end
考虑这三项促销活动:
--------------------------
| PROMOTIONS |
--------------------------
| id | name | product_id |
| 1 | sale | NULL |
| 2 | 10% | 1 |
| 3 | 20% | 2 |
--------------------------
当product_id
为NULL
时,促销适用于所有产品,因此我希望能够获得产品的所有促销活动,如下所示:
Product.find(1).promotions # => [1,2]
Product.find(2).promotions # => [1,3]
我怎样才能做到这一点?
答案 0 :(得分:1)
你可以通过几种不同的方式去寻找这样的促销活动。一种方法是直接访问Promotion
模型
promotions1 = Promotion.where(product_id: [1, nil])
promotions2 = Promotion.where(product_id: [2, nil])
您可以在Product
模型
class Product < ActiveRecord::Base
def all_promotions
Promotion.where(product_id: [self.id, nil])
end
end
然后按如下方式使用它:
Product.find(1).all_promotions # => [1,2]
另一种方法是将Product
对象的促销与所有未附加到特定产品的促销联系起来。这绝对不是最佳解决方案,因为您无法真正利用ActiveRecord
来订购促销活动;你必须使用数组排序。
def all_promotions
self.promotions + Promotion.where(product_id: nil)
end