Rails 日期时间不工作的 ActiveRecord
Rails ActiveRecord where datetime not working
我有一个模型 has_one 计划(来自:日期时间,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 然后我只搜索 from 然后我会获取 m,但如果当前时间是 2018 年 10 月 14 日星期日 20:01:00 UTC +00:00 并且我仅使用 from 进行搜索我什么也得不到。
这是我试过的代码:
scope :s, ->(time, type) { unscoped.joins(:schedule).where("\"schedule.#{type.to_s}\" < ? AND \"schedule.to\" > ?", time, time) }
并且当我调用范围时将是 Model.s(DateTime.now, :from)
。问题是这段代码没有按预期工作,因为它没有给我正确的结果,也没有给我预期的结果。
更新
这是为 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 中的字符串,而不是对 [=14= 中列的引用] table.
schedule
应该是 schedules
因为 Rails 喜欢对 table 名称使用复数形式。
to
和 from
在 SQL 和 PostgreSQL 中是 keywords (您似乎正在使用)所以它们必须是(双) 将它们用作列名时引用。
第一个是通过删除杂散的单引号修复的。第二个是使用复数 table 名称。第三个是双引号有问题的标识符。结果将类似于:
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)
我有一个模型 has_one 计划(来自:日期时间,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 然后我只搜索 from 然后我会获取 m,但如果当前时间是 2018 年 10 月 14 日星期日 20:01:00 UTC +00:00 并且我仅使用 from 进行搜索我什么也得不到。
这是我试过的代码:
scope :s, ->(time, type) { unscoped.joins(:schedule).where("\"schedule.#{type.to_s}\" < ? AND \"schedule.to\" > ?", time, time) }
并且当我调用范围时将是 Model.s(DateTime.now, :from)
。问题是这段代码没有按预期工作,因为它没有给我正确的结果,也没有给我预期的结果。
更新
这是为 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 中的字符串,而不是对 [=14= 中列的引用] table. schedule
应该是schedules
因为 Rails 喜欢对 table 名称使用复数形式。to
和from
在 SQL 和 PostgreSQL 中是 keywords (您似乎正在使用)所以它们必须是(双) 将它们用作列名时引用。
第一个是通过删除杂散的单引号修复的。第二个是使用复数 table 名称。第三个是双引号有问题的标识符。结果将类似于:
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)