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')

你有几个问题,第一个隐藏了其他问题:

  1. 单引号用于 SQL 中的字符串文字,因此 'schedule.from''schedule.to' 只是 SQL 中的字符串,而不是对 [=14= 中列的引用] table.
  2. schedule 应该是 schedules 因为 Rails 喜欢对 table 名称使用复数形式。
  3. tofrom 在 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)