2

以下查询根本不按 id(主键)搜索 - 它一直将 0 分配给 id 并将 search_str 分配给名称。如果我们使用等于运算符而不是“id”的匹配项,它会正确执行此操作。以下范围是否存在问题。

scope :or_search, lambda {|name| where(arel_table[:name].matches("%{search_str}%").or(arel_table[:id].matches("%#{search_str}%")))
4

3 回答 3

1

我对你想要做的事情有点困惑,但首先

arel_table[:name].matches("%{search_str}%")

你错过了#,我认为这应该是

arel_table[:name].matches("%#{search_str}%")

其次,您没有在name任何地方使用您的论点,只是从这个角度来看,也许您想替换search_strname?

于 2013-02-06T01:41:32.510 回答
1

首先你犯了一个错字,我认为你在范围定义的末尾错过了一个右花括号

得到一个答案,我认为你正在做一些匹配 id 或标题的事情?(真的我不敢相信你不应该这样做)

请注意,“search_str”无处不在,因为块的参数是“名称”,因此您可以将其与您要比较的表的任何属性进行比较:)

我能想到的问题的答案是

范围 :or_search, lambda {|title| where(arel_table[:title].matches("%#{title}%").or(arel_table[:id].matches("#{title}")))}

于 2013-02-08T13:28:32.593 回答
1

不确定您是否只是想了解它为什么不起作用,或者您是否正在寻找可行的解决方案。

无论如何,以下内容不在 arel 中,但如果将其添加到模型中会起作用:

def self.or_search(str)
  where("name like :input OR id like :input", input: "%#{str}%")
end
于 2013-02-11T13:01:05.223 回答