我目前有一个范围:
scope :named,->(query) do
where("(first_name || last_name) ~* ?", Regexp.escape(query || "a default string to prevent Regexp.escape(nil) errors"))
end
除了first_name或last_name为nil之外,这是有效的。如果其中一列是nil,我如何找到这些列?
答案 0 :(得分:0)
我认为你可以尝试这样的事情:
scope :named,->(query) do
where("first_name IS NOT NULL OR last_name IS NOT NULL AND (first_name || last_name) ~* ?", Regexp.escape(query || "a default string to prevent Regexp.escape(nil) errors"))
end
答案 1 :(得分:0)
这是搜索姓名的基本范围,它只处理' first_name','仅限#last;'或搜索全名。
如果将查询拆分为数组,则可以获取数组的第一个和最后一个,并且无论查询的长度是一个还是两个都无关紧要。
如果需要,您可以使用正则表达式替换拆分
你显然可以对此进行扩展(例如不区分大小写,排序),但给出了基本的想法。
如果条带失败,还可以通过默认为空字符串来处理nil查询。
scope :named,->(query) do
query.strip! rescue query = ""
query_words = query.split(' ')
where(["first_name LIKE ? OR last_name LIKE ?", "#{query_words.first}%", "#{query_words.last}%"])
end
希望这有帮助