2013-10-28 77 views
1

在Rails4應用程序中,我想創建動態關聯。根據db值創建動態關聯

我有以下型號:

class Pilot < ActiveRecord::Base 
    has_many :cars 
end 

class Cars < ActiveRecord::Base 
    belongs_to :pilot 
end 

汽車有一個屬性的顏色,我想創造儘可能多的關聯可用顏色

舉例來說,如果我有1輛紅旗轎車,2個藍色轎車和1個綠色的車,我想在我的模式試點

has_many :red_cars 
has_many :blue_cars 
has_many :green_cars 

的一點是,我不知道會有所回升的顏色。

是否可以實現它?

謝謝。

UPDATE

我想我大概可以這樣做

#untested. Written just now 
Car.all.map(&:color).uniq.each do |color| 
    has_many "#{color}_cars".to_sym, -> { where(color: '#{color}') }, class_name: 'Car' 
end 

如果沒有好是可能的。

回答

0

您可以輕鬆地爲您的has_many關聯添加條件(確保它們是第一個參數)。

class Pilot < ActiveRecord::Base 
    has_many :cars 
    has_many :red_cars, -> { where(color: 'red') }, class_name: 'Car' 
end 

你可以用named scopes更好地組織它。

class Pilot < ActiveRecord::Base 
    has_many :cars 
    has_many :red_cars, -> { red }, class_name: 'Car' 
end 

class Cars < ActiveRecord::Base 
    belongs_to :pilot 
    scope :red, -> { where(color: 'red') } 
end 

當你去的命名範圍,你可以隨時做@pilot.cars.red找到所有的紅旗車屬於試點,如果這是給你足夠的方便,你可能不需要自定義has_many :red_cars關聯的。

更新

如果你不知道你要事先獲取的顏色,你可以通過動態條件到一個名爲範圍。

class Pilot < ActiveRecord::Base 
    has_many :cars 
end 

class Cars < ActiveRecord::Base 
    belongs_to :pilot 
    scope :with_color, ->(color) { where(color: color) } 
end 

在你的控制器,則可以選擇@pilot.cars.with_color('red')@pilot.cars.with_color(params[:color])。在這種情況下,我不想創建硬編碼has_many :red_cars關聯。

+0

感謝您的答覆,但我的問題是一個比較複雜。我不知道哪種顏色的汽車有可能會在創建新記錄時被選中。 – macsig

+0

我需要按顏色對汽車進行分組。所以我不能將顏色傳遞給控制器​​,但我需要將所有汽車按顏色分開。我想爲每種顏色都有一個關聯(或虛擬屬性)。 – macsig

+0

如何定義顏色並在運行時添加新顏色?如果沒有,您可以使用'named scopes'和'group_by'完成所有工具。如果你真的想要關聯,爲什麼不循環一個顏色數組並在這個循環中動態地建立關聯? –