假设我有以下课程
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关系,以便当我要求solar_system
所有关联时planets
,将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
。
两者均未回答问题,因此如果有人遇到这种情况,我将它们放在此处作为解决方法。