2013-05-10 31 views
0

考虑下面的代码:Rails的:命名范围适用于类的类,但没有实例

user_decorator.rb

Refinery::User.class_eval do 
    has_many :employees, :class_name => 'Refinery::Employee' 

    scope :active_employees, 
     lambda { 
      joins(:employees).merge(::Refinery::Employee.active) 
     } 

end 

employee.rb

module Refinery 
    class Employee < ActiveRecord::Base 
    belongs_to :user, :class_name => 'Refinery::User' 

    scope :active, where(:retired => false) 
    end 
end 

运行导轨控制台...

> ::Refinery::User.active_employees 
=> [ .......... lots of records etc ] 
> user = ::Refinery::User.where(:username => 'test').first 
=> #<Refinery::User .... etc etc> 
> user.active_employees 
NoMethodError: undefined method `active_employees' for #<Refinery::User:0x000000051330f8> 

我在做什么错?

回答

1

A scope与模型相关,而不是与该模型的实例相关。

如果你想这样做,你必须创建一个相同的方法。

至少,我认为是......

+0

这是正确的。范围是类级方法,而不是实例级方法。 @DJTripleThreat,问问你自己,'user.active_employees'意味着什么?如果用户是某种可以让员工在其下的老板,那么你可能想要做一些像user.employees.active_employees这样的事情。 – MrDanA 2013-05-10 15:01:28

+0

@MDDanA感谢您的洞察力。我会试试这个。而古斯塔沃你是对的,这些都是阶级水平的方法。多谢你们! – DJTripleThreat 2013-05-11 05:37:58

相关问题