从WHERE NOT EXISTS查询返回ActiveRecord关系

时间:2017-05-11 13:11:15

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

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

{"fields": [ Client has_manystate_changes StateChange一个belongs_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)')个对象而不是ActiveRecord Array。我需要对该查询中返回的Relation的{​​{1}}运行更新。

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

我也明白,这可能是一种令人费解的方式......

1 个答案:

答案 0 :(得分:1)

  

我也明白,这可能是一种令人费解的方式......

拥有简单的AR界面 - 确实令人费解:)

我可能会选择一些scope

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的客户退回给您。