未定义的方法`default_scoped?'在访问范围时

时间:2012-09-11 07:51:47

标签: ruby-on-rails ruby-on-rails-3 activerecord named-scope

我在访问范围时遇到此错误。

这是AR模型

class StatisticVariable < ActiveRecord::Base
  attr_accessible :code, :name

  has_many  :statistic_values

  scope :logins, where(code: 'logins').first
  scope :unique_logins, where(code: 'unique_logins').first
  scope :registrations, where(code: 'registrations').first

end

当我尝试StatisticVariable.logins或任何其他范围时,它会给出:

NoMethodError: undefined method `default_scoped?'

如果我将范围配置为类方法,那么它可以很好地工作。

def self.registrations
    where(code: 'registrations').first
end

请指导我理解并解决此问题。

2 个答案:

答案 0 :(得分:28)

您所谓的scopes不是范围:它们不可链接。

我猜Rails会尝试在您的结果中附加潜在的default_scope,从而导致失败。

做类似的事情:

  scope :logins, where(code: 'logins')
  scope :unique_logins, where(code: 'unique_logins')
  scope :registrations, where(code: 'registrations')

  def self.login
    logins.first
  end

答案 1 :(得分:0)

我收到此错误是因为我的一个范围正在返回self,我认为这是关系对象(不起作用);返回nil取代了预期的结果。例如:

scope :except_ids, -> ids do
  if ids.present?
    ids = ids.split(',') if ids.respond_to?(:split)
    where('id not in (?)', ids)
  end
end

如果是ids.present?返回false,条件返回nil,范围无效,但仍可链接。