Regexp里面的'where'方法

时间:2013-11-01 14:40:25

标签: mysql ruby-on-rails ruby regex

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

答案 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
#...