【问题标题】:Rails: Find records with a certain combination of associated recordsRails:查找具有某种关联记录组合的记录
【发布时间】:2018-01-11 16:54:50
【问题描述】:

我有一个 User 模型,其中包含许多 Events。每个event 有两个属性,namedevice

我想获取至少有一个事件的所有users

events.name = 'Logged in' AND events.device = 'iPhone'

并且至少有一个事件:

events.name = 'Upgraded' AND events.device = 'Desktop'

我正在遍历条件哈希,因此我还需要能够使用 ActiveRecord 范围执行 OR 语句,如下所示:

results = User.all
results = results.where("events.name = 'Logged in' AND events.device = 'iPhone'")
results = results.where("events.name = 'Upgraded' AND events.device = 'Desktop'")

上面的查询不起作用,因为它只查找符合所有条件的事件。

如何在 Rails 4 的 ActiveRecord 中编写此查询?

【问题讨论】:

  • 制作它并尝试:User.joins(:events).where("(events.name = 'Logged in' AND events.device = 'iPhone') OR (events.name = 'Upgraded' AND events.device = 'Desktop')")
  • 谢谢,阅读您的评论我意识到我没有指定一个关键要求,我已经更新了我的问题。

标签: ruby-on-rails activerecord


【解决方案1】:

在这段代码中

User.joins(:events).where("events.name = 'Logged in' AND events.device = 'iPhone'").where("events.name = 'Upgraded' AND events.device = 'Desktop'")

您正在链接调用并使用另一个条件 .where("events.name = 'Upgraded' AND events.device = 'Desktop'") 进一步过滤第一组 where("events.name = 'Logged in' AND events.device = 'iPhone'")

编辑:

User.joins(:events).where(" (events.name = 'Logged in' AND events.device= 'iPhone') AND (events.name = 'Upgraded' AND events.device = 'Desktop')").

在 Rails 5 中,将添加 OR 子句(在 Github 问题讨论中掠夺)。

【讨论】:

  • 谢谢,阅读您的评论我意识到我没有指定一个关键要求,我已经更新了我的问题。所以我想在 Rails 4 中没有办法做范围 OR 语句?
  • 在 Rails 4 中没有 OR 子句的 ActiveRecord 实现,你必须编写“原始”SQL。
  • 我将编辑关于您原始问题编辑的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2011-07-16
  • 2011-07-16
  • 1970-01-01
相关资源
最近更新 更多