1

データベースを通過して適切な結果を返すメソッドが必要です。この場合、著者、タイトル、発行日、または ISBN コードで書籍を検索します。where() メソッドを使用することにしましたが、2 つの問題が発生しました。

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"^)

言うまでもなく、インターネットでさまざまなドキュメントやチュートリアルを見つけました.1つは「^」が最後にあるはずで、もう1つは最初にあるはずです...

4

4 に答える 4

1

これはそれを行う必要があります:

self.where("title REGEXP ? OR author REGEXP ? OR publishing_date REGEXP ? OR isbn REGEXP ?", query, query, query, query)

「?」含まれている変数によって順番にサブされます。各列に同じ正規表現を使用する場合は、コードをそのままプラグインするだけです

2 番目の部分については、 LIKE演算子 を確認することをお勧めします。

特定の文字列で始まる列を一致させるには、次のようにします。

self.where("title LIKE ?", (query + "%"))

そして、特定の文字列で終わる列を一致させるには:

self.where("title LIKE ?", ("%" + query)) 
于 2013-11-01T14:56:22.650 に答える
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 に答える
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 に答える