0

Railscasts #343 Full-Text Search in PostgreSQL に従っていますが、最初に問題が発生します。

モデルの次の行を置き換えます。

where("name ilike :q or content ilike :q", q: "%#{query}%")

where("name @@ :q or content @@ :q", q: query)

しかし、Railscast のように検索を実行することはできません。名前に「FOO」があり、コンテンツに「BAR」があり、「FOO BAR」を検索すると、結果は空になります。(古いコードと「ilike」機能と同様)

SQL リクエストは次のようになります。

* FROM "posts" where (name @@ 'foo bar' or content @@ 'foo bar')

Windows 7 x64 で PostgreSQL 9.2.2 、Rails 3.2.6 および Ruby 1.9.3p125 を使用しています。

事前に感謝します。

編集

私の宝石ファイル:

    source 'https://rubygems.org'

gem 'rails', '3.2.6'

gem 'pg'
gem "ransack"


group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'


  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

コメント行をすべて削除しました。

PS:明確にするために、「ランサック」を追加する前に、同じ問題がありました。

4

1 に答える 1

2

ライアンの例では、結果を返すには、記事にスーパーマンとキャラクターの両方が必要です。それはあなたが望むようにORではありません。そこで全文検索が登場します(エピソードの後半)

私はちょうどrailscastコードにほぼ正確に従った*。

このコード

class Article < ActiveRecord::Base
  attr_accessible :content, :title

  def self.text_search(query)
    if query.present?
      where("title @@ :q or content @@ :q", q: query)
    else
      scoped
    end
  end
end

このSQLを生成します

SELECT "articles".* FROM "articles" WHERE (title @@ 'because' or content @@ 'because')

これは機能し、タイトルまたはコンテンツのいずれかに「because」が含まれる記事を返します

  • 名前の代わりに「タイトル」を使用しました
于 2013-02-05T02:57:15.793 に答える