Disons que j'ai les classes suivantes
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
a une portée life_supporting
et SolarSystem
has_many :planets
. Je voudrais définir mon has_many relation de sorte que lorsque je demande un solar_system
pour tous les associés planets
, l' life_supporting
champ est automatiquement appliquée. Essentiellement, je voudrais solar_system.planets == solar_system.planets.life_supporting
.
Exigences
-
Je n'ai pas envie de changer de
scope :life_supporting
enPlanet
dedefault_scope where('distance_from_sun > ?', 5).order('diameter ASC')
-
Je tiens également à éviter la duplication de ne pas avoir à ajouter d'
SolarSystem
has_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => 'diameter ASC'
Objectif
J'aimerais avoir quelque chose comme
has_many :planets, :with_scope => :life_supporting
Edit: Solutions
Comme @phoet dit, il peut ne pas être possible de parvenir à un défaut portée à l'aide d'ActiveRecord. Cependant, j'ai trouvé deux solutions. Les deux éviter les doublons. La première, alors que pendant longtemps, maintient évident de lisibilité et de transparence, et le second est un helper de type méthode qui est sortie est explicite.
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
Une autre solution qui est beaucoup plus propre est tout simplement ajouter la méthode suivante pour SolarSystem
def life_supporting_planets
planets.life_supporting
end
et pour utiliser solar_system.life_supporting_planets
où vous l'auriez solar_system.planets
.
Ni de réponses à la question je viens donc de mettre ici que les solutions quelqu'un d'autre devrait rencontrer cette situation.