Rails SCOPE 上下文中的 WHERE 方法,例如?句法
Rails WHERE method in the context of SCOPE for like ? syntax
我无法在 SCOPE 上下文中找到 WHERE 方法的正确语法。我的分类模型有几个范围可以很好地按类别或区域过滤分类:
#in the model
scope :filter_by_category, -> (category) {where category: category}
scope :filter_by_area, -> (area) {where area: area}
我想执行更高级的 SCOPE 过滤器来搜索分类广告的标题包含特定字符串。在 SCOPE 之外,我通常会通过以下方式检索数据:
Classified.where("title like ?", "%title%")
但是在 SCOPE 上下文中,我无法找到正确的语法并不断收到一些错误(意外 ->,期待“结束”范围 [...])。我尝试了以下方法:
scope :filter_by_title -> (title) { where ("title like ?","%title%")}
scope :filter_by_title -> (title) { where ("like ?","%title%")}
两者都给我语法错误。谁能帮我找到正确的语法?
你遇到了三个问题:
lambda 是 scope
的参数,您需要在符号后加一个逗号:
scope :filter_by_title, -> ...
# --------------------^
白space在Ruby中很重要,所以f (x, y)
和f(x, y)
是不同的东西。 f (x, y)
中的括号是表达式分组括号,而 f(x, y)
中的括号是方法调用括号。所以 f (x, y)
是语法错误,因为 x, y
不是表达式。去除杂散space:
scope :filter_by_title, ->(title) { where('title like ?', ...
# ---------------------------------------^ No more space here
您想使用字符串插值将 title
参数扩展到范围:
scope :filter_by_title, ->(title) { where('title like ?', "%#{title}%") }
# ----------------------------------------------------------^^-----^ Interpolation
我无法在 SCOPE 上下文中找到 WHERE 方法的正确语法。我的分类模型有几个范围可以很好地按类别或区域过滤分类:
#in the model
scope :filter_by_category, -> (category) {where category: category}
scope :filter_by_area, -> (area) {where area: area}
我想执行更高级的 SCOPE 过滤器来搜索分类广告的标题包含特定字符串。在 SCOPE 之外,我通常会通过以下方式检索数据:
Classified.where("title like ?", "%title%")
但是在 SCOPE 上下文中,我无法找到正确的语法并不断收到一些错误(意外 ->,期待“结束”范围 [...])。我尝试了以下方法:
scope :filter_by_title -> (title) { where ("title like ?","%title%")}
scope :filter_by_title -> (title) { where ("like ?","%title%")}
两者都给我语法错误。谁能帮我找到正确的语法?
你遇到了三个问题:
lambda 是
scope
的参数,您需要在符号后加一个逗号:scope :filter_by_title, -> ... # --------------------^
白space在Ruby中很重要,所以
f (x, y)
和f(x, y)
是不同的东西。f (x, y)
中的括号是表达式分组括号,而f(x, y)
中的括号是方法调用括号。所以f (x, y)
是语法错误,因为x, y
不是表达式。去除杂散space:scope :filter_by_title, ->(title) { where('title like ?', ... # ---------------------------------------^ No more space here
您想使用字符串插值将
title
参数扩展到范围:scope :filter_by_title, ->(title) { where('title like ?', "%#{title}%") } # ----------------------------------------------------------^^-----^ Interpolation