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