0

Ok, donc, voici une relation amusante. Les relations sont quelque chose comme:Retourne la relation ActiveRecord à partir de la requête WHERE NOT EXISTS

A Clienthas_manystate_changes, et un StateChangebelongs_to un Client.

J'ai cette requête: 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)')

Le problème est que cela retourne un objet Array et non un ActiveRecord Relation. Je dois exécuter une mise à jour sur le state_changes qui appartiennent au clients retourné à partir de cette requête. Il y a donc essentiellement deux problèmes: obtenir les résultats en tant que relation ActiveRecord, puis obtenir tous leurs state_changes, également en tant que relation ActiveRecord, afin de pouvoir exécuter la mise à jour.

Je comprends aussi que cela pourrait être une façon alambiquée de s'y prendre ...

+0

avez-vous réussi? –

+0

Yup J'ai basé ma solution hors de ces étendues et il a fait comme demandé :) merci –

+0

Ok, bon à savoir :) –

Répondre

1

Je comprends aussi que cela pourrait être une façon alambiquée d'aller à ce sujet ..

Ayant interface facile AR - en effet, il est alambiqué :)

je serais probablement aller avec quelques scope s:

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 

Ceci devrait vous renvoyer les clients qui n'ont pas associé state_changes avec current à false.

+0

Merci pour votre réponse rapide! Ce que je suis en train d'essayer de faire est d'obtenir tous les clients qui n'ont pas de changements d'état qui ont la valeur de l'attribut bool "actuel" de faux. –

+0

Je vais mettre à jour ma question pour inclure que StateChange a un champ booléen dans le db appelé "courant" –

+0

@ barnacle.m Je vois, je vais éditer la réponse –