Sql 活动记录日期介于;颠倒;

Sql 活动记录日期介于;颠倒;,sql,ruby-on-rails,ruby,activerecord,Sql,Ruby On Rails,Ruby,Activerecord,社区 我想知道是否有一种方法(除了原始sql)可以执行这样的查询 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; 我试过这个 d

社区

我想知道是否有一种方法(除了原始sql)可以执行这样的查询

    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 })
但这就是我得到的

SyntaxError in AfiliadoController#index
    /Users/cristiantorres/Documents/pruebaRailsTransporte/app/controllers/afiliado_controller.rb:4:
 syntax error, unexpected ':', expecting => ...re(afiliacionvehiculos: {date :fechaInicio..:fechaFinal }) ... ^
 /Users/cristiantorres/Documents/pruebaRailsTransporte/app/controllers/afiliado_controller.rb:4: 
syntax error, unexpected '}', expecting keyword_end ...ate :fechaInicio..:fechaFinal }) ... ^
我知道传递原始sql字符串应该是可行的,但如果有人知道其他方法,我会很感激,因为我没有正确理解该语言,对此表示抱歉

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

date: from_date..to_date
Afiliado.joins(:persona, :afiliacionvehiculos).where(date: fechaInicio..fechaFinal)
因此,您的查询将如下所示:

date: from_date..to_date
Afiliado.joins(:persona, :afiliacionvehiculos).where(date: fechaInicio..fechaFinal)
如果
afiliacionvehiculos
表中有
fechaInicio
fechaFinal
列,则也可以执行以下操作:

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

不幸的是,Rails不是这样工作的

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

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

WHERE (\"baz\".\"CURRENT_DATE\" BETWEEN 'article' AND 'aside')"
没有办法解决这个问题,因为添加表名和转义值的Rails魔法是一种安全特性

因此,唯一的解决方案是将条件部分写入
SQL

where('CURRENT_DATE BETWEEN av.fechaInicio AND av.fechaFinal')

谢谢,几个小时后,我开始怀疑除了原始sql之外没有其他答案,你说得很清楚,谢谢你花时间回答我的问题,非常有用的答案很高兴它对你有帮助。别忘了接受答案。看看它是如何工作的:最后,我使用了这个,工作完美无瑕,这不是您给我的确切答案,但您的答案让我找到了所需的查询@afiliados=Afiliado.joins(“personas.idPersonas=afiliados.personas\u idPersonas”\“afiliacionvehiculo.idAfiliado=afiliados.idAfiliado'\”上的左外连接人物角色以及afiliacionvehiculo.fechaInicio和afiliacionvehiculo.fechaFinal之间的当前日期”).distinct()