Angenommen, ich habe die folgenden Klassen
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
hat einen Umfang life_supporting
und SolarSystem
has_many :planets
. Ich möchte meine has_many-Beziehung so definieren, dass der Bereich automatisch angewendet wird , wenn ich solar_system
nach allen zugeordneten Elementen frage . Im Wesentlichen möchte ich .planets
life_supporting
solar_system.planets == solar_system.planets.life_supporting
Bedarf
Ich nicht ändern wollen
scope :life_supporting
inPlanet
zudefault_scope where('distance_from_sun > ?', 5).order('diameter ASC')
Ich möchte auch Doppelarbeit verhindern, indem ich nichts hinzufügen muss
SolarSystem
has_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => 'diameter ASC'
Tor
Ich hätte gerne so etwas
has_many :planets, :with_scope => :life_supporting
Bearbeiten: Work Around
Wie @phoet sagte, ist es möglicherweise nicht möglich, mit ActiveRecord einen Standardbereich zu erreichen. Ich habe jedoch zwei mögliche Problemumgehungen gefunden. Beides verhindert Doppelarbeit. Die erste Methode ist zwar lang, bietet jedoch eine offensichtliche Lesbarkeit und Transparenz, und die zweite Methode ist eine Hilfsmethode, deren Ausgabe explizit ist.
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
Eine andere Lösung, die viel sauberer ist, besteht darin, einfach die folgende Methode hinzuzufügen SolarSystem
def life_supporting_planets
planets.life_supporting
end
und solar_system.life_supporting_planets
überall dort zu verwenden, wo Sie es verwenden möchten solar_system.planets
.
Keiner von beiden beantwortet die Frage, also habe ich sie hier nur als Workarounds platziert, sollte jemand anderes auf diese Situation stoßen.