Скажем, у меня есть следующие классы
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
.
Ни один из ответов не отвечает на вопрос, поэтому я просто помещаю их здесь как работу, если кто-то еще столкнется с этой ситуацией.