PG喜欢查询不起作用

时间:2012-11-14 18:12:26

标签: ruby-on-rails ruby-on-rails-3 postgresql heroku

所以我在我的博客应用程序中构建了一个搜索。我的开发环境在我的localhost上运行mysql2。以下代码在开发环境中非常有用:

class SearchController < ApplicationController

def index
 if params[:s]== ""
   #do nothing
 elsif params[:s]== "all posts"
   @posts = Post.page(params[:page]).per_page(7).order("id DESC").all
 else
   @posts = Post.page(params[:page]).per_page(7).order("id DESC").find(:all, :conditions=> ["title like ?", "%"+params[:s] + "%"])
 end
end

但是当我推到使用PG的Heroku时它不再有效。我需要在@posts = Post.page(params[:page]).per_page(7).order("id DESC").find(:all, :conditions=> ["title like ?", "%"+params[:s] + "%"])中更改哪些内容才能使其在pg中运行?

谢谢!

1 个答案:

答案 0 :(得分:6)

您的第一个错误是您在开发和生产环境中使用不同的数据库。这是一个非常糟糕的主意,特别是当其中一个数据库像MySQL一样邋and而另一个数据库与PostgreSQL一样严格时。如果要在PostgreSQL之上部署并确保在两种环境中使用相同的PostgreSQL版本,请不要自己动手,在开发环境中设置PostgreSQL。

你的第二个错误与你的第一个错误有关:MySQL's LIKE通常不区分大小写:

  

以下两个语句说明字符串比较不区分大小写,除非其中一个操作数是二进制字符串:

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0

但PostgreSQL是区分大小写的并提供ILIKE for case insensitive matching

  

可以使用关键字ILIKE代替LIKE,以根据活动区域设置使匹配不区分大小。

所以你要使用

Page.where('title ilike ?', "%#{params[:s]}%")...

使用PostgreSQL。如果你想要的东西在两者中都会或多或少地相同,你可以手工贬低所有东西:

Page.where('lower(title) like lower(?)', "%#{params[:s]}%")...

您可能希望查看全文搜索系统,LIKE查询通常只是创建表扫描的简单方法,没有人喜欢表扫描。