Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 3 如何在PGSQL中按日期搜索?_Ruby On Rails 3_Postgresql_Heroku - Fatal编程技术网

Ruby on rails 3 如何在PGSQL中按日期搜索?

Ruby on rails 3 如何在PGSQL中按日期搜索?,ruby-on-rails-3,postgresql,heroku,Ruby On Rails 3,Postgresql,Heroku,我得到这个错误: ActionView::Template::Error(PGError:Error:operator不存在:没有时区的时间戳~~未知第1行:…“articles”其中(“articles”。”在“LIKE”2010创建的_ 我有一个归档控制器,在这里我可以按类型和年、月、日动态显示文章,url中有这些字段中的任何一个。在mysqlite中,我有以下索引操作: def index filter_title @articles = Article.where(:create

我得到这个错误:

ActionView::Template::Error(PGError:Error:operator不存在:没有时区的时间戳~~未知第1行:…“articles”其中(“articles”。”在“LIKE”2010创建的_

我有一个归档控制器,在这里我可以按类型和年、月、日动态显示文章,url中有这些字段中的任何一个。在mysqlite中,我有以下索引操作:

def index
  filter_title
  @articles = Article.where(:created_at.matches % date_builder, :genre.matches % genre_builder).order("created_at DESC")
  respond_to do |format|
    format.json { render :json => @articles }
    format.xml  { render :xml => @articles }
    format.html
  end
end
这个日期生成器函数

def date_builder
  @date = ""
  @date += params[:year] if !(params[:year].nil?)
  @date += "-" + params[:month] if !(params[:month].nil?)
  @date += "-" + params[:day] if !(params[:day].nil?)
  @date += "%"
  @date
end

这将使用metawhere查找与我提供的字符串部分匹配的日期。这在Sqlite中非常有效。我已将我的应用程序迁移到heroku和PGSQL上,但它不允许我这样做。解决方案是什么?谢谢!

在postgres中,时间戳不像sqllite中那样存储为字符串:

select 'A' where localtimestamp like '2011-04-04%';
ERROR:  operator does not exist: timestamp without time zone ~~ unknown
改用
=
怎么样

select 'A' where localtimestamp >= '2011-04-04';

 ?column?
----------
 A
(1 row)

虽然我喜欢@JackPDouglas answer,但我想尽量避免sql代码进入我的项目,所以我最终做了以下工作:

...
date_builder
  if !(params[:year].nil?)
    @articles = Article.where(
      {:created_at.gt => @datelower} &
      {:created_at.lt => (@datehigher - 1.second)} &
      :genre.matches % genre_builder
      ).order("created_at DESC")
  else
...
该日期的计算方法如下:

def date_builder
  if !(params[:day].nil?)
    @datelower = Time.utc(params[:year], params[:month], params[:day])
    @datehigher = @datelower + 1.day
  elsif !(params[:month].nil?)
    @datelower = Time.utc(params[:year], params[:month], 01)
    @datehigher = @datelower + 1.month
  elsif !(params[:year].nil?)
    @datelower = Time.utc(params[:year], 01, 01)
    @datehigher = @datelower + 1.year
  end
end

@Leon yes-或
选择“A”,其中日期(“年”,本地时间戳)=“2011-01-01”;
选择“A”,在哪里显示字符(本地时间戳,“yyyy”)='2011';
如果您愿意,那么如果只是年份,请选择'A'在创建位置>='2011-01-01'和创建位置<'2012-01-01',对于年份和月份,请选择'A'在创建位置>='2011-01-01'和创建位置<'2011-02-01'等。是的。这意味着可以使用创建位置上的索引,这不是典型的如果你转换成一个字符串,情况就是这样。我对Hibernate不太了解,但是
{:created_at.ge=>@datelower}&{:created_at.lt=>@datehigher}
会更好吗?否则我想你会错过一些匹配。