所以我在我的博客应用程序中构建了一个搜索。我的开发环境在我的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中运行?
谢谢!
答案 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查询通常只是创建表扫描的简单方法,没有人喜欢表扫描。