Digamos que tengo las siguientes clases
class SolarSystem < ActiveRecord::Base
has_many :planets
end
class Planet < ActiveRecord::Base
scope :life_supporting, where('distance_from_sun > ?', 5).order('diameter ASC')
end
Planettiene un alcance life_supportingy SolarSystem has_many :planets. Me gustaría definir mi relación has_many para que cuando pregunte solar_systempor todos los asociados planets, el life_supportingalcance se aplique automáticamente. Esencialmente, me gustaría solar_system.planets == solar_system.planets.life_supporting.
Requisitos
Yo no quiero cambiar
scope :life_supportingdePlanetadefault_scope where('distance_from_sun > ?', 5).order('diameter ASC')También me gustaría evitar la duplicación al no tener que agregar a
SolarSystemhas_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => 'diameter ASC'
Objetivo
Me gustaria tener algo como
has_many :planets, :with_scope => :life_supporting
Editar: Work Arounds
Como dijo @phoet, puede que no sea posible lograr un alcance predeterminado usando ActiveRecord. Sin embargo, he encontrado dos posibles soluciones. Ambos evitan la duplicación. El primero, aunque largo, mantiene una legibilidad y transparencia obvias, y el segundo es un método de tipo auxiliar cuya salida es explícita.
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
Otra solución que es mucho más limpia es simplemente agregar el siguiente método a SolarSystem
def life_supporting_planets
planets.life_supporting
end
y para usar solar_system.life_supporting_planetsdonde quiera que lo use solar_system.planets.
Ninguno de los dos responde a la pregunta, así que los pongo aquí como solución alternativa en caso de que alguien más se encuentre con esta situación.