다음과 같은 수업이 있다고 가정 해 봅시다.
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
. 내가 물어 때 그래서 난 내 has_many 관계를 정의하고자하는 solar_system
모든 관련 위해 planets
의 life_supporting
범위가 자동으로 적용됩니다. 기본적으로 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를 사용하여 기본 범위를 달성하지 못할 수도 있습니다. 그러나 두 가지 잠재적 인 해결 방법을 찾았습니다. 둘 다 중복을 방지합니다. 첫 번째는 길지만 분명한 가독성과 투명성을 유지하고 두 번째는 출력이 명시적인 도우미 유형 메서드입니다.
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
훨씬 더 깨끗한 또 다른 해결책은 다음 방법을 추가하는 것입니다. SolarSystem
def life_supporting_planets
planets.life_supporting
end
그리고 solar_system.life_supporting_planets
어디에서나 사용할 수 있습니다 solar_system.planets
.
둘 다 질문에 대답하지 않으므로 다른 사람이 이러한 상황에 직면 할 경우 해결 방법으로 여기에 넣었습니다.