【问题标题】:Rails where based on association基于关联的 Rails
【发布时间】:2019-05-25 20:03:25
【问题描述】:

我正在尝试根据关联查询项目,但对如何表达我的查询的日期部分感到有些困惑。日期以文本格式存储,例如“2018-12-25”。

year = params[:ridden_in]
@items = Item.joins(:cycle).where(cycles: { (:date.to_date).year: year })

谁能帮我解决我哪里出错了?

【问题讨论】:

  • @muistooshort 更改架构在我的待办事项清单上,但现在不能这样做。只需要暂时让它工作,然后在接下来的几周内进行调整。我正在使用 PostgreSQL

标签: ruby-on-rails postgresql activerecord associations rails-activerecord


【解决方案1】:

最简单的方法是使用 SQL 函数。您可以尝试将 SQL 隐藏在 AREL 后面,但这很快就会变得一团糟。

一种方法是直接操作字符串:

Item.joins(:cycle).where('substring(cycles."date" from 1 for 4) = ?', year)

或稍微更面向未来,因为您的约会最终将成为真正的约会:

Item.joins(:cycle).where('extract(year from cycles."date"::date) = ?', year)
Item.joins(:cycle).where('extract(year from cast(cycles."date" as date)) = ?', year)

这两个都假设您的 date 列确实遵循 ISO8601 日期格式。

如果您经常这样做,那么您可以在 cycles.date 上添加部分索引(即索引您最终使用的任何函数的结果)。

【讨论】:

  • 我一直在尝试这些,但不幸的是,它们中的任何一个都无法正常工作。如果我将字段更改为真实日期字段,将如何实现?
  • “不能让它们中的任何一个工作”具体是什么意思?
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多