假设我有以下课程
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 关系,这样当我为所有相关的 planets
请求 solar_system
时,就会自动应用 life_supporting
作用域。本质上,我想 solar_system.planets == solar_system.planets.life_supporting
。
我做 没有想改变 Planet
中的 scope :life_supporting
到
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.planets
的任何地方使用 solar_system.life_supporting_planets
。
两者都没有回答这个问题,所以我只是把它们放在这里,作为其他人遇到这种情况时的解决办法。