ActiveRecord:如何与外键或null建立has_many关系

时间:2015-11-20 23:13:57

标签: ruby-on-rails activerecord

我有这两个模型:

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_idNULL时,促销适用于所有产品,因此我希望能够获得产品的所有促销活动,如下所示:

Product.find(1).promotions # => [1,2]
Product.find(2).promotions # => [1,3]

我怎样才能做到这一点?

1 个答案:

答案 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