1

Rails4 アプリで、動的な関連付けを作成したいと考えています。

私は次のモデルを持っています:

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

ポイントは、ピックアップされる色がわからないことです。

それを実装することは可能ですか?

ありがとう。

アップデート

私はおそらく次のようなことができると思います

#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

より良いものがない場合。

4

2 に答える 2

0

関連付けに条件を簡単に追加できますhas_many(それらが最初の引数であることを確認してください)。

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

名前付きスコープを使用すると、これをさらにうまく整理できます。

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この場合、ハードコーディングされた関連付けを作成したくありません。

于 2013-10-28T10:21:47.380 に答える