0

我正在关注 PostgreSQL 中的 Railscasts #343 Full-Text Search,一开始我遇到了一个问题。

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

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

经过

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

但是,它仍然没有像他在 railscasts 中那样执行搜索。如果名称中有“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”之前,我遇到了同样的问题。

4

1 回答 1

2

在 Ryan 的示例中,文章必须同时包含超人和字符才能在结果中返回。这不是我认为你想要的方式的 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')

哪个有效并返回标题或内容中包含“因为”的文章

  • 我使用“标题”而不是名称
于 2013-02-05T02:57:15.793 回答