2013-01-10 83 views
0

我想我想在Rails中做一個聯合,但是根據這個職位rails union hack, how to pull two different queries together聯盟本身並不支持Rails。我想知道是否有更好的方法來解決這個問題。替代ActiveRecord的聯盟

我有物品表,每個物品有很多價格,但我只想加入一個價格到每個物品。

要確定項目的正確價格我在價格模型中有兩個額外的外鍵:category_id和discount_id。每個人都可以獨立申報一個物品的價格。

Ex。 項目+類別=價格1和項目+折扣=價格2

如果discount_id匹配一個傳遞的ID我想排除價格結果只有項目匹配項目+類別。此外,我試圖不放鬆延遲加載。

希望問題很清楚!如果沒有,我會嘗試澄清更多,預先感謝。

+0

我需要在此聲明中進一步澄清:「如果discount_id匹配傳遞的ID」。另外,價格和物品之間的關聯究竟是什麼 - 哪一個持有另一個的外鍵?你能舉一個具體的例子來說明一件物品和一些價格模型,以及在這種情況下計算出的結果嗎? – PinnyM

+0

價格具有項目,類別和折扣的外鍵。路過的部分意味着我將在控制器中有一個可用的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列表中 –

回答

1

你的模型將開始尋找這樣的事情:

這樣的
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