以下查询根本不按 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}%")))
以下查询根本不按 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}%")))
我对你想要做的事情有点困惑,但首先
arel_table[:name].matches("%{search_str}%")
你错过了#
,我认为这应该是
arel_table[:name].matches("%#{search_str}%")
其次,您没有在name
任何地方使用您的论点,只是从这个角度来看,也许您想替换search_str
为name
?
首先你犯了一个错字,我认为你在范围定义的末尾错过了一个右花括号
得到一个答案,我认为你正在做一些匹配 id 或标题的事情?(真的我不敢相信你不应该这样做)
请注意,“search_str”无处不在,因为块的参数是“名称”,因此您可以将其与您要比较的表的任何属性进行比较:)
我能想到的问题的答案是
范围 :or_search, lambda {|title| where(arel_table[:title].matches("%#{title}%").or(arel_table[:id].matches("#{title}")))}
不确定您是否只是想了解它为什么不起作用,或者您是否正在寻找可行的解决方案。
无论如何,以下内容不在 arel 中,但如果将其添加到模型中会起作用:
def self.or_search(str)
where("name like :input OR id like :input", input: "%#{str}%")
end