0

所以我在我的博客应用程序中建立了一个搜索。我的开发环境在我的本地主机上运行 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 中工作吗?

谢谢!

4

1 回答 1

6

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

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

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

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

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

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

所以你想使用

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

与 PostgreSQL。而且,如果您希望两者的工作方式或多或少相同,则可以手动降低所有内容:

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

不过,您可能想研究一个全文搜索系统,LIKE 查询通常只是创建表扫描的一种简单方法,没有人喜欢表扫描。

于 2012-11-14T19:04:25.097 回答