Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 Arel:从功能中选择_Ruby On Rails_Ruby_Arel - Fatal编程技术网

Ruby on rails Arel:从功能中选择

Ruby on rails Arel:从功能中选择,ruby-on-rails,ruby,arel,Ruby On Rails,Ruby,Arel,考虑以下查询: SELECT DATE_TRUNC('hour', date_range) FROM GENERATE_SERIES(:start_date, :end_date, :interval) as date_range 是否可以使用生成_系列(…)作为表(数据源)?理想情况下,它将如下所示: t = series(start, end, as: 'date_range') dt = Arel::Nodes::NamedFunction.new('DATE_TRUNC', ['ho

考虑以下查询:

SELECT DATE_TRUNC('hour', date_range) 
FROM GENERATE_SERIES(:start_date, :end_date, :interval) as date_range
是否可以使用
生成_系列(…)
作为表(数据源)?理想情况下,它将如下所示:

t = series(start, end, as: 'date_range')
dt = Arel::Nodes::NamedFunction.new('DATE_TRUNC', ['hour', t[:date_range]])
t.project(dt)
SELECT DATE_TRUNC('hour', date_range) FROM GENERATE_SERIES('2015-01-01 00:15:38'::TIMESTAMP, '2015-01-10 23:59:59'::TIMESTAMP, '1 HOUR') as date_range;
Upd1。为什么我需要
生成\u系列
?我有一些数据,我需要处理这些数据可用的时间戳,并将其输出为2D图。作为一个简单的例子,考虑<代码>点击流< /代码> =(<代码> ID ,<代码> CREATEDATA)。我想绘制在某个日期之前针对给定日期时间网格(即11月17日、11月18日、11月19日、…、11月30日)进行的点击次数。问题是我希望这一切都发生在PostgreSQL内部

Upd2。没有变量的示例查询可能如下所示:

t = series(start, end, as: 'date_range')
dt = Arel::Nodes::NamedFunction.new('DATE_TRUNC', ['hour', t[:date_range]])
t.project(dt)
SELECT DATE_TRUNC('hour', date_range) FROM GENERATE_SERIES('2015-01-01 00:15:38'::TIMESTAMP, '2015-01-10 23:59:59'::TIMESTAMP, '1 HOUR') as date_range;

一种方法是简单地手动构建AST的所有必要部分

def timestamp(ts)
  Arel::Nodes::NamedFunction.new(
    'CAST', [
      Arel::Nodes::As.new(
        Arel::Nodes.build_quoted(ts),
        Arel::Nodes::SqlLiteral.new('timestamp')
      )
    ]
  )
end

def series(from, to, by, options = {})
  Arel::Nodes::NamedFunction.new(
    'GENERATE_SERIES', [
      timestamp(from),
      timestamp(to),
      Arel::Nodes::SqlLiteral.new(by)
    ]
  ).as(options.fetch(:as, 'series'))
end

def date_trunc(by, attribute)
  Arel::Nodes::NamedFunction.new(
    'DATE_TRUNC', [Arel.sql("'#{by}'"), attribute]
  )
end

date_range = Arel::Table.new('date_range')
result = date_range.
  from(series(5.days.ago, 4.days.ago, "'1 hour'", as: 'date_range')).
  project(date_trunc('hour', date_range[:date_range]))
测试:


除了您使用的代码外,您能否简要描述一下您正在尝试实现的目标?可能有一种更好或不同的解决方案不涉及
generate_series
函数。请提供一个没有变量的实际查询示例。@SimoneCarletti在generate series后面用动机更新了这个问题。现在有意义了吗?@dankohn我用实际的查询更新了这个问题。希望有帮助。真的有用吗。我认为应该是
Arel::Nodes::SqlLiteral.new(timestamp(from))