Rails - Postgresql - 全文搜索 - Railscasts 343

时间:2013-02-04 17:24:46

标签: ruby-on-rails ruby-on-rails-3 postgresql full-text-search

我正在关注PostgreSQL中的Railscasts#343全文搜索,并且在开始时我遇到了问题。

我在我的模型中替换了这一行:

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

通过

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

但是,它仍然没有像在轨道广播中那样进行搜索。如果在名称中我有“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:要明确的是,在我添加“ransack”之前,我遇到了同样的问题。

1 个答案:

答案 0 :(得分:2)

在Ryan的例子中,文章必须同时在结果中返回超人和角色。它不是我认为你希望它的方式。这就是全文搜索的地方(在剧集的后面)

我几乎完全遵循了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')

工作并返回在标题或内容

中包含'因果'的文章
  • 我使用'title'代替名称