2013-02-16 79 views
1

我有3個基本模型作爲鞋子,顏色和大小。創建與三個模型的循環關聯

鞋有多種顏色和多種尺寸,但對於每種顏色他們有available_sizes。

爲了能夠執行我應該看看這兩個shoe_id和COLOR_ID,並根據他們在三節取模型size_ids。

相反的條件(available_colors)中也存在。

然後,我們的模型將是這樣的:

class Shoe < ActiveRecord::Base 
    has_many :stocks 
    has_many :colors, through: :stocks 
    has_many :sizes, through: :stocks 
end 

class Color < ActiveRecord::Base 
    has_many :stocks 
    has_many :shoes, through: :stocks 
end 

class Size < ActiveRecord::Base 
    has_many :stocks 
    has_many :shoes, through: :stocks 
end 

class Stock < ActiveRecord::Base 
    belongs_to :shoe 
    belongs_to :color 
    belongs_to :size 
end 

我想要什麼,雖然,查詢像shoe.sizes.availabe_colorsshoe.colors.available_sizes

我應該如何實現關聯,使所有的鞋,顏色和大小的模型玩好起來呢?

回答

1

如果我理解你是正確的,你想找到特定顏色的特定鞋子的所有可用尺寸。換句話說,紅鞋「A」的庫存尺寸是多少。

由於股票是一個連接所有其他型號的,你會想要做就可以了你的查詢。首先,你可以用獲得的股票爲特定的鞋子,然後切割下來的股票,以特定的顏色,然後問它獨特的尺寸

Shoe.find(shoe_id).stocks.where(:color_id => color_id).sizes.uniq 

要清理乾淨啓動,使其在Shoe

一個實例方法
class Shoe < ActiveRecord::Base 
    def available_sizes_for_color(color_id) 
    stocks.where(:color_id => color_id).sizes.uniq 
    end 
end 

Shoe.find(shoe_id).available_sizes_for_color(color_id) 

和通過大小尋找顏色,反之亦然。

使用股票模型的替代:

class Stock < ActiveRecord::Base 
    class << self 
    def sizes(shoe_id, color_id) 
     Shoe.find(shoe_id).stocks.where(:color_id => color_id).sizes.uniq 
    end 
    end 
end 

Stock.sizes(shoe_id, color_id) 

最後,使用尺寸型號:

class Size 
    class << self 
    def find_all_by_shoe_and_color(shoe_id, color_id) 
     joins(:stock => [:shoe, :color]).where('shoes.id = ? AND colors.id = ?', size_id, color_id) 
    end 
    end 
end 

Size.find_all_by_shoe_and_color(shoe_id, color_id) 
+0

好吧,我希望在關聯-Y的方式來解決這一點,但你已經證明我有幾個示波器也可以做到這一點。如果它適合所有情況,我會盡力實施並看到。謝謝。 – gungorkocak 2013-02-16 22:35:42