Sql 活动记录日期介于;颠倒;
社区 我想知道是否有一种方法(除了原始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
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()