Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:命名范围在类上工作,但不在类的实例上工作_Ruby On Rails_Refinerycms_Named Scope - Fatal编程技术网

Ruby on rails Rails:命名范围在类上工作,但不在类的实例上工作

Ruby on rails Rails:命名范围在类上工作,但不在类的实例上工作,ruby-on-rails,refinerycms,named-scope,Ruby On Rails,Refinerycms,Named Scope,给定以下代码: user\u 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 module

给定以下代码:

user\u 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
module Refinery
  class Employee < ActiveRecord::Base
    belongs_to :user, :class_name => 'Refinery::User'

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

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

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

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

    scope :active, where(:retired => false)
  end
end
模块精炼
类Employee“精炼厂::用户”
作用域:活动,其中(:retired=>false)
结束
结束
运行轨道控制台…

> ::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>
::炼油厂::User.active\u员工
=>【大量记录等】
>user=::Refinery::user.where(:username=>test')。首先
=> #
>user.active\u员工
NoMethodError:未定义的“活跃员工”方法#

我做错了什么?

范围与模型相关,而与该模型的实例无关

如果你想这样做,你必须创建一个方法来做同样的事情


至少,我认为是这样……

这是正确的。作用域是类级方法,而不是实例级方法@DJTripleThreat,问问自己,
user.active\u员工的本意是什么?如果用户是某种老板,可以让员工担任其职务,那么您可能希望执行类似于
user.employees.active\u employees
@MrDanA的操作,谢谢您的洞察力。我试试这个。Gustavo你是对的,这些是类级方法。谢谢大家!