Ruby on rails Rails:命名范围在类上工作,但不在类的实例上工作
给定以下代码: user\u decorator.rbRuby 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
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你是对的,这些是类级方法。谢谢大家!