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