为什么这个范围在我的rails应用程序中使用递归?

时间:2014-11-19 01:54:42

标签: ruby-on-rails activerecord

scope :name, -> (name){ where "lower(name) LIKE ?", "%#{name.downcase}%"}

我有一个name属性的模型。当我直接查询该属性时,一切正常。当我尝试使用上述范围进行干燥时,我开始得到堆栈级错误 - 不知何故,该范围甚至在Client.where(true)语句上引起递归。即使我将其从name更改为number,但是如果我有机会与内置方法发生冲突,它也无法正常工作。我在俯瞰什么?

相关模型:

class Client < ActiveRecord::Base

  scope :name, -> (name){ where "lower(name) LIKE ?", "%#{name.downcase}%"}
end

with schema:

create_table "clients", force: true do |t|
  t.string   "name"
  t.string   "number"
  t.string   "email",            null: false
  # Other columns omitted for brevity, nothing unusual or odd about them.
end

1 个答案:

答案 0 :(得分:3)

问题是您的范围名为namename方法通常返回类名。一些Rails代码使用name方法,例如introspection module中的parent_name方法:

def parent_name
  if defined? @parent_name
    @parent_name
  else
    @parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil  # This line calls the "name" method
  end
end  

parent_name可以使用Admin::User等类名称并返回Admin

parent_name等核心功能compute_table_name等核心功能使用compute_table_name等方法。当范围命名为current_scope时,name逻辑和stack level too deep逻辑可能会在循环中混淆。这会导致scope :by_name, ->(name) { where "lower(name) LIKE ?", "%#{name.downcase}%" } 错误。

您可以通过将范围更改为以下内容来避免这种情况:

{{1}}