2010-09-28 5 views
2

Je veux trouver tous les contacts où la valeur de leur: relation has_one à: contact_status n'a pas de valeurComment utiliser la condition hash: sur un .find pour un nil? méthode Rails (relation has_one)

J'ai créé un alias_attribute :status, :status_contact

(que cela signifie nul?) Puis-je faire quelque chose du genre:

contacts = Contact.find(:all, :conditions => {:contact_status => nil }, :include => {:status_contact}) 

Je ne sais pas exactement comment ça fonctionne. Fondamentalement, je ne lui attribue aucune valeur, c'est juste une relation: has_one.

EDIT: On dirait des contacts devraient être une relation de belongs_to rendant ainsi le changement D'après les commentaires, il semble que les contacts devraient effectivement avoir une relation de belongs_to à status_contacts qui à son tour « has_one » avec contacts.

J'utilise Searchlogic pour créer named_scopes ... Je pense il résout le problème, quelqu'un de familier avec ça?

Cependant, l'utilisateur peut parfois lui attribuer une valeur. Je ne veux pas que ceux-ci viennent dans la trouvaille.

Actuellement obtenir cette erreur:

SQLite3 :: SQLException: " "près de: erreur de syntaxe:.. SELECT "contacts"" id" AS t0_r0, "contacts" "prenom" AS t0_r1, « contacts "." last_name "AS t0_r2," contacts "." titre "AS t0_r3," contacts "." téléphone "AS t0_r4," contacts "." fax "AS t0_r5," contacts "." email "AS t0_r6," contacts "." société "AS t0_r7," contacts "." created_at "AS t0 _r8," contacts "." updated_at "AS t0_r9," contacts "." campaign_id "AS t0_r10," contacts "." date_entrée "AS t0_ r11, "contacts". "Company_id" AS t0_r12, "contacts". "Id_adresse" AS t0_r13, "contacts". "Nom_fichier_vcard" AS t0_r14, "contacts". "Vcard_conten t_type "AS t0_r15," contacts "." vcard_file_size "AS t0_r16," contacts "." vcar d_updated_at "AS t0_r17," contacts "." direct "AS t0_r18," contacts "." sugarcrm "AS t0_r19," status_contacts " . "id" AS t1_r0, "status_contacts". "État" AS t1_r1, "status_contacts". "Contact_id" AS t1_r2, "status_contac ts". "Created_at" AS t1_r3, "status_contacts". "Updated_at" AS t1_r4 FROM " contacts » LEFT OUTER JOIN "état _contacts" ON status_contacts.contact_id = contacts.id OU (: status_contact.status = NULL)

Répondre

2

Votre erreur ne correspond pas au code que vous montrez. Je suppose que vous faites quelque chose comme

:conditions => ['status = ?', nil] 

mais ce que vous devriez vérifier n'est pas le status, qui est l'objet lié. C'est comme ça que vous le vérifieriez dans ruby-code, mais pas dans sql.

À l'intérieur de votre table, vous auriez un champ appelé status_contact_id, et lorsque ce champ est NULL (l'équivalent de la base de données de nil) alors il n'a aucune relation.

Vous devez en effet faire quelque chose comme

contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL") 

[EDIT] Puisque vous utilisez une relation has_one, totalement lu sur cela, la clé étrangère est en effet défini dans le tableau status_contacts. Mais, pour interroger les éléments n'ayant pas de status_contacts devient un peu plus compliqué.

Dans sql, vous feriez quelque chose comme

select * from contacts where id not in (select contact_id from status_contacts) 

et je traduirais que Ruby comme ceci:

contacts = Contacts.find_by_sql("select * from contacts where id not in (select contact_id from status_contacts)" 

Personnellement, je ne peux pas penser à une meilleure façon en ce moment.

+0

Hmmm ... peut-être que je l'ai en arrière. Je n'ai pas de status_contact_id ... ma table status_contact a un contact_id .... et il semble fonctionner ... – Angela

+0

contact has_one status_contact - cela signifie-t-il que celui qui n'a pas la clé étrangère? Et je teste la foreign_key de status_contact? – Angela

+0

c'est ce que j'ai trouvé, on dirait que le belongs_to devrait avoir la clé étrangère? http://blog.hasmanythrough.com/2007/1/15/basic-rails-association-cardinality – Angela

1

essayer

contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL") 

en supposant que votre colonne fk est contacts.status_contact_id

MISE À JOUR: nathanvda is corre ct; De plus, je pense que vous pouvez le faire sans find_by_sql - non testé ...

contacts = Contact.find(:all, 
    :conditions => "contacts.id NOT IN (select contact_id from status_contacts)" 
) 

NOTE: Je pense toujours que vous voulez vraiment utiliser contact avec belongs_to: status_contact

+0

Salut, ne devrait pas l'enregistrement avec le belongs_to avoir la clé étrangère? http://blog.hasmanythrough.com/2007/1/15/basic-rails-association-cardinality – Angela

+0

oui vous avez raison, après avoir regardé votre erreur sql je peux voir le schéma maintenant - ma pensée initiale est que le has_one est pas la relation idéale à utiliser pour ce cas; à moins que vous ayez un status_contact unique par contact, ce que je doute est le cas – house9

+0

non ce n'est pas unique .... donc ça devrait être l'inverse, le contact appartient à status_contact? – Angela

0

dépend de la version de Rails, je travaille principalement en 2.3.5, mais je crois que "conditions", dans ce contexte, est censé être un "fragment de type SQL"."

En général, vous ferait quelque chose comme

contacts = Contact.find(:all, :include => :contact_status, :conditions => ["contact_status.status = ?", nil]) 

En outre, nil Ruby signifie complètement dépourvu de valeur. Il stocke rien. [], Un tableau vide, retourne false si vous envoyez le message nil?, il répondra vrai au message empty? cependant.

+0

J'utilise 2.3.5 ... la version "hash" marche-t-elle aussi bien que ce que j'ai mis? – Angela

+0

Le hachage fonctionnera pour spécifier les champs et leurs valeurs, je ne suis pas sûr que cela fonctionnera pour un alias ou non. Bien que je ne puisse pas imaginer pourquoi ça ne le serait pas. – Robbie

+0

il sait à cause de l'associé has_one à se joindre à l'adresse_contact.contact_id? – Angela

Questions connexes