以下查询根本不按id(主键)进行搜索 - 它一直将0分配给id,将search_str分配给name。如果我们使用equals运算符而不是匹配“id”匹配,它会正确执行。以下范围是否存在问题。
scope :or_search, lambda {|name| where(arel_table[:name].matches("%{search_str}%").or(arel_table[:id].matches("%#{search_str}%")))
答案 0 :(得分:1)
我对你要做的事情感到有些困惑,但首先是
arel_table[:name].matches("%{search_str}%")
你错过了#
,我认为这应该是
arel_table[:name].matches("%#{search_str}%")
其次,你没有在任何地方使用你的name
论证,只是看看这个,也许你想用search_str
取代name
?
答案 1 :(得分:1)
首先你做了一个错字,我认为你在范围定义结束时错过了一个结束大括号
回答我认为你正在做一些匹配id或头衔的事情?(真的我不敢相信你不应该这样做)
请注意,“search_str”来自无处,因为该块的参数是“name”,因此您可以将其与要比较的表的任何属性进行比较:)
我能为你的问题思考的答案是
范围:or_search,lambda {| title |其中(arel_table [:标题] .matches( “%#{TITLE}%”)或(arel_table [:ID] .matches( “#{TITLE}”)))} 削减
答案 2 :(得分:1)
不确定您是否只是想了解它为什么不起作用,或者您是否正在寻找可行的解决方案。
无论如何,以下内容不在arel中,但如果将其添加到模型中则可以使用:
def self.or_search(str)
where("name like :input OR id like :input", input: "%#{str}%")
end