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
答案 0 :(得分:3)
问题是您的范围名为name
。 name
方法通常返回类名。一些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}}