Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 类似PG的查询不起作用_Ruby On Rails_Ruby On Rails 3_Postgresql_Heroku - Fatal编程技术网

Ruby on rails 类似PG的查询不起作用

Ruby on rails 类似PG的查询不起作用,ruby-on-rails,ruby-on-rails-3,postgresql,heroku,Ruby On Rails,Ruby On Rails 3,Postgresql,Heroku,因此,我在我的博客应用程序中构建了一个搜索。我的开发环境正在本地主机上运行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

因此,我在我的博客应用程序中构建了一个搜索。我的开发环境正在本地主机上运行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
class SearchController[“类似标题?”,“%”“+”params[:s]+“%”)
结束
结束
但当我推到使用PG的Heroku时,它就不再工作了。在
@posts=Post.page(params[:page])中是否有需要更改的内容。每个页面(7)。顺序(“id DESC”)。查找(:all,:conditions=>[“title like?”,“%”+params[:s]+“%”)将使其在pg中工作的内容


谢谢

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

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

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

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0
但PostgreSQL是区分大小写的,并提供:

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

所以你想用

Page.where('title ilike ?', "%#{params[:s]}%")...
使用PostgreSQL。如果你想要的东西在这两种情况下或多或少都能起到相同的作用,你可能可以用手把所有东西都写下来:

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

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

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

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

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

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0
但PostgreSQL是区分大小写的,并提供:

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

所以你想用

Page.where('title ilike ?', "%#{params[:s]}%")...
使用PostgreSQL。如果你想要的东西在这两种情况下或多或少都能起到相同的作用,你可能可以用手把所有东西都写下来:

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

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

它怎么会失败?它是否给出了一个错误,或者匹配太少还是太多?作为参数传递的是什么,您希望匹配的是什么,实际匹配的是什么?PG需要简单的引号来表示类似的条件,它非常挑剔@它没有返回任何results@MrYoshiji:每个(符合标准的)数据库都需要单引号来表示字符文字。@MrYoshiji:Oracle、PostgreSQL、Firebird、DB2、Teradata、MySQL(在ANSI模式下)、SQL Server、Ingres、Vertica、Cubrid、HSQL、Derby、H2-仅举几个例子。它是如何失败的?它是否给出了一个错误,或者匹配太少还是太多?作为参数传递的是什么,您希望匹配的是什么,实际匹配的是什么?PG需要简单的引号来表示类似的条件,它非常挑剔@它没有返回任何results@MrYoshiji:每个(符合标准的)数据库都需要单引号来表示字符文字。@MrYoshiji:Oracle、PostgreSQL、Firebird、DB2、Teradata、MySQL(在ANSI模式下)、SQL Server、Ingres、Vertica、Cubrid、HSQL、Derby、H2-仅举几个例子。这也给了我错误
错误的参数数(1代表0)
.where('title-ilike?,“%{params[:s]}%”)
@Deekor:您是否将其称为
页面。where(…).Page…
@posts=Post.per_第(7)页。页面(params[:Page]).order(“id-DESC”)。where('title-ilike?,“%{params[:s]}%”)
我不能夸大这个答案的第一句话的重要性。为开发和生产使用不同的数据库是一个巨大的错误。这也给了我一个错误
错误的参数数(1代表0)
.where('title ilike?',“%#{params[:s]}%”
@Deekor:你把它称为
页面。where(…).page…
@posts=Post.per_page(7).page(params[:page]).order(“id DESC”).where('title ilike?',“%#{params[:s]}%”)我怎么强调这个答案的第一句话有多重要都不为过。为开发和生产使用不同的数据库是一个巨大的错误。