Rails ActiveRecord,其中datetime不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails ActiveRecord,其中datetime不起作用相关的知识,希望对你有一定的参考价值。
我有一个模型has_one Schedule(from:datetime,from_a:datetime,to:datetime)。我想检索所有具有适合运行查询的日期时间的模型。
例如,我的模型m的时间表来自:太阳,2018年10月15日19:00:00 UTC +00:00,from_a:太阳,2018年10月14日19:20:00 UTC +00:00和:太阳,2018年10月14日20:00:00 UTC +00:00。如果当前时间是太阳,2018年10月14日19:14:00 UTC +00:00然后我只搜索从那时起我会得到m,但是如果当前时间是太阳,那么,2010年10月14日20:01:00 UTC +00:00我只搜索我什么也得不到。
这是我尝试过的代码:
scope :s, ->(time, type) { unscoped.joins(:schedule).where(""schedule.#{type.to_s}" < ? AND "schedule.to" > ?", time, time) }
当我打电话的范围将是Model.s(DateTime.now, :from)
。问题是这段代码没有按预期工作,因为它没有给我正确的结果,也没有给我预期的结果。
UPDATE
这是Model.s(DateTime.now, :from)
生成的查询
SELECT "models".* FROM "models" INNER JOIN "schedules" ON "schedules"."model_id" = "models"."id" WHERE ("schedules.from" < '2018-10-15 19:59:33.737073' AND "schedules.to" > '2018-10-15 19:59:33.737073')
你有几个问题,第一个隐藏其他问题:
- 单引号用于SQL中的字符串文字,因此
'schedule.from'
和'schedule.to'
只是SQL中的字符串,而不是对schedule
表中列的引用。 schedule
应该是schedules
,因为Rails喜欢使用复数作为表名。to
和from
是SQL和PostgreSQL中的keywords(您似乎正在使用它们),因此当您将它们用作列名时,它们必须被(双重)引用。
第一个是通过删除杂散的单引号来修复的。第二个是使用复数表名。第三个是双重引用违规标识符。结果将是这样的:
unscoped.joins(:schedule).where(%Q(schedules."#{type.to_s}" < ? and schedules."to" > ?), time, time)
也许:
unscoped.joins(:schedule).where(%Q(schedules."#{type.to_s}" < :time and schedules."to" > :time), time: time)
以上是关于Rails ActiveRecord,其中datetime不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4,ActiveRecord,查找当前用户未评论的所有帖子
如何避免在 MongoDB(使用 Mongoid)或 ActiveRecord(使用 MySQL 的 Rails)中插入两次相同的记录?
Ruby On Rails 5,activerecord query其中模型关联id包括数组中的所有id