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
Planet
tiene un alcance life_supporting
y SolarSystem
has_many :planets
. Me gustaría definir mi relación has_many para que cuando pregunte solar_system
por todos los asociados planets
, el life_supporting
alcance se aplique automáticamente. Esencialmente, me gustaría solar_system.planets == solar_system.planets.life_supporting
.
Requisitos
Yo no quiero cambiar
scope :life_supporting
dePlanet
adefault_scope where('distance_from_sun > ?', 5).order('diameter ASC')
También me gustaría evitar la duplicación al no tener que agregar a
SolarSystem
has_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_planets
donde 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.