PG喜欢查询不起作用

Dee*_*kor 0 postgresql ruby-on-rails heroku ruby-on-rails-3

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

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

mu *_*ort 6

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

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

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

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0
Run Code Online (Sandbox Code Playgroud)

但PostgreSQL是区分大小写的,并提供ILIKE不区分大小写的匹配:

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

所以你想要使用

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

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

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

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

  • 我不能夸大这个答案第一句的重要性.使用不同的数据库开发和生产是一个巨大的错误. (3认同)