2015-11-20 43 views
1

我有這兩種模式:ActiveRecord的:如何建立與外鍵或空的has_many關係

class Promotion < ActiveRecord::Base 
    belongs_to :product 
end 

class Product < ActiveRecord::Base 
    has_many :promotions 
end 

並考慮這3個優惠:

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

你可以通過幾種不同的方式去尋找這樣的促銷活動。一種方法是隻訪問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 
+0

很好的解決方案@Joe,但我認爲存在一種方法來爲'has_many'方法提供一些選項。或者我錯了? – Rodrigo

+0

我一直在想一個使用關聯的人,但它似乎會與'ActiveRecord'關聯操作的方式相反。通過'has_many',暗示'product'的'promotions'是所有'promotions',其中'promotions.product_id = products.id'是真實的。我認爲沒有辦法去修改它,因爲我覺得這可能是危險的。 –

相關問題