0

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

我在MODELE替换此行:

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') 

我使用PostgreSQL 9.2.2,3.2.6的Rails和Ruby 1.9.3p125上Windows 7 x64。

提前致谢。

编辑

我的宝石文件:

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”之前,我有同样的问题。

+0

请包括你的gemfile。 – gabrielhilal

+0

你可以尝试'foo | bar'而不是'foo bar'吗? – rainkinz

+0

我得到:* FROM“posts”where(name @@'foo | bar'或content @@'foo | bar')。 – Dl33ter

回答

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') 

其工作,并返回有 '因为' 在标题或内容

  • 我用 '标题' 文章代替名称
+0

我获得了相同的SQL请求,但是它搜索'Posts'是否在标题中有'FOO + BAR'或者内容中有'FOO + BAR'。它没有达到我期望的效果:搜索'FOO或BAR是否出现在标题或内容中'。当他用'@@'替换'ilike'时,就像预先制作的开始一样。 – Dl33ter

+0

你应该用你的代码创建一个github仓库,并且通过db/seeds.rb创建数据。然后把你正在使用的确切查询和你期望的结果。几乎可以肯定的是,你对本教程的这个中间步骤的期望与Ryan所说的不同步。 –