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%")}

两者都给我语法错误。谁能帮我找到正确的语法?

你遇到了三个问题:

  1. lambda 是 scope 的参数,您需要在符号后加一个逗号:

     scope :filter_by_title, -> ...
     # --------------------^
    
  2. 白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
    
  3. 您想使用字符串插值将 title 参数扩展到范围:

    scope :filter_by_title, ->(title) { where('title like ?', "%#{title}%") }
    # ----------------------------------------------------------^^-----^ Interpolation