我需要一个能够通过数据库并返回适当结果的方法。在这种情况下,它按作者,标题,出版日期或ISBN代码搜索书籍。我决定使用where()方法,但我遇到了两个问题:
1)我无法通过多个字段进行搜索。很容易找到一个标题:
def self.browse(query)
if query.nil?
nil
else
self.where("title REGEXP :query", query: query)
end
end
但我不知道如何设置它以寻找标题或作者或isbn等尝试
self.where("(title OR author OR publishing_date OR isbn) REGEXP :query", query: query)
但它不起作用
第二,我希望我的查询只匹配单词的开头或结尾。在mysql Workbench中它非常简单,但我很难在Rails中完成它。这是我到目前为止所尝试过的(并且失败了):
self.where("title REGEXP :query", query: /^(query)*$/)
self.where("title REGEXP /^:query/", query: query)
self.where("title REGEXP :query", query: $"query"^)
毋庸置疑,在互联网上我发现了许多不同的文档或教程,一个说“^”应该在最后,另一个应该在开头......
答案 0 :(得分:1)
这应该这样做:
self.where("title REGEXP ? OR author REGEXP ? OR publishing_date REGEXP ? OR isbn REGEXP ?", query, query, query, query)
“?”将由包含的变量按顺序加载。如果要为每列使用相同的正则表达式,则只需按原样插入代码
至于第二部分,您可能需要查看LIKE运算符。
要匹配以给定字符串开头的列:
self.where("title LIKE ?", (query + "%"))
并匹配以特定字符串结尾的列:
self.where("title LIKE ?", ("%" + query))
答案 1 :(得分:1)
1)你想在你的sql所在地使用括号以及AND和OR子句:
(title IS NOT NULL AND title REGEXP :id_query) OR (name IS NOT NULL AND name REGEXP :name_query)
2)你会想要同时使用^(行首)和$(行尾)。
(^something|something$)
以下是我与自己的代码匹配的整个事情的示例。将id和name替换为您自己的列,并在其中添加额外的OR以匹配更多列
Charity.where("(id IS NOT NULL AND id REGEXP :id_query) OR (name IS NOT NULL AND name REGEXP :name_query)", id_query:'1', name_query:'(^a|a$)')
Here is the to_sql output of the above:
Charity.where("(id IS NOT NULL AND id REGEXP :id_query) OR (name IS NOT NULL AND name REGEXP :name_query)", id_query:'1', name_query:'(^a|a$)').to_sql
=> "SELECT `charities`.* FROM `charities` WHERE ((id IS NOT NULL AND id REGEXP '1') OR (name IS NOT NULL AND name REGEXP '(^a|a$)'))"
答案 2 :(得分:0)
创建你的sql查询并传入ActiveRecord执行方法,它将执行sql查询而不需要在ActiveRecord查询中更改
sql query = "your sql query"
ActiveRecord::Base.connection.execute(sql query)
答案 3 :(得分:0)
您可以使用or
:
class MyARModel < ActiveRecord::BAse
scope :search, ->(rgx) do
where('title REGEXP ?', rgx)
.or('author REGEXP ?' rgx)
.or('publishing_date REGEXP ?' rgx)
.or('isbn REGEXP ?' rgx)
end
#...