1

我需要一个可以通过数据库并返回适当结果的方法。在这种情况下,它按作者、标题、出版日期或 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"^)

不用说,在互联网上我找到了许多不同的文档或教程,一个说“^”应该在末尾,另一个应该在开头......

4

4 回答 4

1

1)您将希望在 where 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$)'))"
于 2013-11-01T15:01:39.047 回答
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)) 
于 2013-11-01T14:56:22.650 回答
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
#...
于 2013-11-01T15:01:58.803 回答
0

创建你的 sql 查询并传入 ActiveRecord 执行方法,它将执行 sql 查询并且不需要在 ActiveRecord 查询中更改

sql query = "your sql query"
ActiveRecord::Base.connection.execute(sql query) 
于 2013-11-01T14:48:31.507 回答