假设我有以下课程
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 关系,以便当我要求 a solar_system
for all associatedplanets
时,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
.
两者都没有回答这个问题,所以我只是把它们放在这里,以防其他人遇到这种情况。