【问题标题】:Return ActiveRecord relation from WHERE NOT EXISTS query从 WHERE NOT EXISTS 查询返回 ActiveRecord 关系
【发布时间】:2017-05-11 13:11:15
【问题描述】:

好的,这是一个有趣的。关系类似于:

一个Clienthas_manystate_changes,一个StateChangebelongs_to一个Client

我有这个问题: Client.find_by_sql('SELECT * FROM clients cs WHERE NOT EXISTS (SELECT * FROM state_changes WHERE state_changes.client_id = cs.id AND current = true)')

问题在于它返回一个Array 对象而不是一个ActiveRecord Relation。我需要对属于从该查询返回的clientsstate_changes 运行更新。

因此本质上存在两个问题,将结果作为 ActiveRecord 关系获取,然后将它们的所有 state_changes 也作为 ActiveRecord 关系获取,以便我可以运行更新。

我也明白这可能是一种复杂的方法......

【问题讨论】:

  • 你搞定了吗?
  • 是的,我的解决方案是基于这些范围的,它按照要求完成了 :) 谢谢
  • 好的,很高兴知道:)

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


【解决方案1】:

我也明白这可能是一种复杂的方式。

拥有简单的 AR 界面 - 确实很复杂 :)

我可能会选择一些scopes:

class StateChange
  scope :active, -> { where.not(current: false) }
  # I believe with your setup it is not equal to `where(current: true)`
end

class Client
  scope :some_smart_name, -> { includes(:state_changes).merge(StateChange.active) }
end

这应该会返回未将 state_changescurrent 设置为 false 关联的客户。

【讨论】:

  • 感谢您的快速回复!我实际上想要做的是让所有没有状态更改的客户端的“当前”布尔属性值为 false。
  • 我将更新我的问题以包括 StateChange 在数据库中有一个名为“current”的布尔字段
  • @barnacle.m 除非我遗漏了什么——更新的答案应该可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多