你的模型將開始尋找這樣的事情:
這樣的
class Price < ActiveRecord::Base
belongs_to :item
belongs_to :category
belongs_to :discount
scope :category, where("prices.category_id IS NOT NULL")
scope :discount, where("prices.discount_id IS NOT NULL")
end
class Item < ActiveRecord::Base
has_many :prices
end
class Category < ActiveRecord::Base
has_many :prices
end
class Discount < ActiveRecord::Base
has_many :prices
end
一種方法是一個類的方法添加到Price
封裝此邏輯:
class Price < ActiveRecord::Base
def self.used
discount_items_sql = self.discount.select("prices.item_id").to_sql
where("prices.discount_id IS NOT NULL OR prices.item_id NOT IN (#{discount_items_sql})")
end
end
這有效的是與此查詢相同:
SELECT * FROM prices
WHERE prices.discount_id IS NOT NULL -- the discount_id is present on this record,
OR prices.item_id NOT IN ( -- or no discount_id is present for this item
SELECT item_id FROM prices WHERE discount_id IS NOT NULL)
您可以添加這些輔助方法您Item
型號DS爲了簡單:
class Item < ActiveRecord::Base
def category_price
prices.category.first
end
def discount_price
prices.discount.first
end
def used_price
prices.used.first
end
end
現在你可以很容易地得到價格的每一個人「類型」爲單個項目(將nil
爲不可用的價格):
item.category_price
item.discount_price
item.used_price
我需要在此聲明中進一步澄清:「如果discount_id匹配傳遞的ID」。另外,價格和物品之間的關聯究竟是什麼 - 哪一個持有另一個的外鍵?你能舉一個具體的例子來說明一件物品和一些價格模型,以及在這種情況下計算出的結果嗎? – PinnyM
價格具有項目,類別和折扣的外鍵。路過的部分意味着我將在控制器中有一個可用的discount_id參數。假設你有3個物品1的物品1類別1的物品2的價格P1和物品2的物品1的物品2的物品3的價格3。如果discount_id參數是4,我想返回p1和p3,但不是p2,因爲我已經有了item2的價格。這將是item_id + discounted_id價格與item_id + category_id價格的結合,其item_id未顯示在item_id + discounted_id列表中 –