活动记录日期在"逆转"

时间:2015-09-05 02:55:00

标签: sql ruby-on-rails ruby activerecord

社区

我想知道是否有办法(除了原始的sql)来做这样的查询

  - (void)testB {} will be the second test

- (void)testA {} will be the first test

- (void)testC {} will be the third test

我试过这个

    SELECT * FROM
    mydb.afiliados AS a
        LEFT OUTER JOIN
    afiliacionvehiculo AS av ON av.idAfiliado = A.idAfiliado
WHERE a.idAfiliado = 3 AND CURRENT_DATE BETWEEN av.fechaInicio AND av.fechaFinal;

但这就是我得到的。

date=Date.new
@afiliados=Afiliado.joins(:persona, :afiliacionvehiculos).where(afiliacionvehiculos: {date :fechaInicio..:fechaFinal })

我知道传递一个原始的sql字符串应该可以工作,但是如果有人知道另一种方式我会感激

2 个答案:

答案 0 :(得分:2)

我不能正确理解这种语言,对不起。

但是,您的日期范围语法是错误的。您可以在活动记录中传递日期范围,如下所示:

date: from_date..to_date

因此,您的查询将是这样的:

Afiliado.joins(:persona, :afiliacionvehiculos).where(date: fechaInicio..fechaFinal)

如果您的afiliacionvehiculos表格中包含fechaIniciofechaFinal列,那么您也可以这样做:

Afiliado.joins(:persona, :afiliacionvehiculos).where('CURRENT_DATE between afiliacionvehiculos.fechaInicio and afiliacionvehiculos.fechaFinal')

答案 1 :(得分:0)

不幸的是,Rails不能像这样工作。

如果您在where中使用哈希语法,那么Rails总是希望key是列的名称(而不是SQL语句)并且值是值检查(而不是数据库列名称)。

即使简单where('CURRENT_DATE' => ('foo'..'bar'))也会转换为:

WHERE (\"baz\".\"CURRENT_DATE\" BETWEEN 'article' AND 'aside')"

并且没有办法解决这个问题,因为这种 Rails magic 添加了表名并且值被转义是安全功能。

因此唯一的解决方案是部分地在SQL

中写入条件
where('CURRENT_DATE BETWEEN av.fechaInicio AND av.fechaFinal')