次のクラスがあるとしましょう
class SolarSystem < ActiveRecord::Base
has_many :planets
end
class Planet < ActiveRecord::Base
scope :life_supporting, where('distance_from_sun > ?', 5).order('diameter ASC')
end
Planet
スコープlife_supporting
とSolarSystem
has_many :planets
。にsolar_system
関連付けられているすべてのを要求するとplanets
、life_supporting
スコープが自動的に適用されるように、has_many関係を定義したいと思います。基本的に、私は欲しいですsolar_system.planets == solar_system.planets.life_supporting
。
要件
私はないではない変更する
scope :life_supporting
にPlanet
しますdefault_scope where('distance_from_sun > ?', 5).order('diameter ASC')
また、追加する必要がないので重複を防ぎたい
SolarSystem
has_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => 'diameter ASC'
ゴール
のようなものが欲しいのですが
has_many :planets, :with_scope => :life_supporting
編集:回避策
@phoetが言ったように、ActiveRecordを使用してデフォルトのスコープを達成することは不可能かもしれません。ただし、2つの潜在的な回避策を見つけました。どちらも重複を防ぎます。1つ目は、長い間、明らかな可読性と透明性を維持し、2つ目は、出力が明示的なヘルパータイプのメソッドです。
class SolarSystem < ActiveRecord::Base
has_many :planets, :conditions => Planet.life_supporting.where_values,
:order => Planet.life_supporting.order_values
end
class Planet < ActiveRecord::Base
scope :life_supporting, where('distance_from_sun > ?', 5).order('diameter ASC')
end
Another solution which is a lot cleaner is to simply add the following method to SolarSystem
def life_supporting_planets
planets.life_supporting
end
and to use solar_system.life_supporting_planets
wherever you'd use solar_system.planets
.
Neither answers the question so I just put them here as work arounds should anyone else encounter this situation.