Rails Activerecord Arels:不支持的参数类型:字符串.改为构建AREL节点



我正在使用Arels来创建查询。在此查询中,我使用generate_series函数。这是我的代码:

    def generate_series
      Arel::Nodes::NamedFunction.new('GENERATE_SERIES', [start_date, end_day, '1 day'])
    end
def start_date
      Arel::Nodes::SqlLiteral.new(<<-SQL
         CASE WHEN DATE_PART('hour', NOW() AT TIME ZONE 'ICT') < #{Time.now - 3days} THEN (CURRENT_DATE - INTERVAL '14 days') ELSE (CURRENT_DATE - INTERVAL '13 days') END
      SQL
      )
    end
    def end_date
      Arel::Nodes::SqlLiteral.new(<<-SQL
         CASE WHEN DATE_PART('hour', NOW() AT TIME ZONE 'ICT') < #{Time.now} THEN (CURRENT_DATE - INTERVAL '1 day') ELSE CURRENT_DATE END
      SQL
      )
    end

当我尝试通过generate_series.to_sql进行测试时。我遇到例外:

arel ::访问者:: UnsupportedVisitError:不支持的参数类型: 细绳。改为构建AREL节点。

我尝试简短测试代码:

def generate_series
      Arel::Nodes::NamedFunction.new('GENERATE_SERIES', ['19/11/2012', '20/11/2012', '1 day'])
 end

问题是相同的。请告诉我如何解决此问题。

您可以使用Arel::Nodes.build_quoted引用文字:

def generate_series
      Arel::Nodes::NamedFunction.new('GENERATE_SERIES', 
             [start_date, end_date, Arel::Nodes.build_quoted('1 day')]
      )
end

这样的优点是,您不必记住像Arel::Nodes::SqlLiteral一样包括并手动逃脱引号。

您的最后一个参数应该是Arel::Nodes。因此,您应该将1 day包装到Arel::Nodes:SqlLiteral中。这是更新的代码:

def generate_series
      Arel::Nodes::NamedFunction.new('GENERATE_SERIES', 
             [start_date, end_date, Arel::Nodes::SqlLiteral.new(''1 day'')]
      )
end

注意到,您还必须在(单个)引号内包装1 day,即:'1 day'。因为如果您不这样做,生成的查询将是:

GENERATE_SERIES(start, stop, 1 day) 

但是,真正的查询应该是:

GENERATE_SERIES(start, stop, '1 day') 

相关内容

  • 没有找到相关文章

最新更新