2010-09-29 4 views
1

est-il une meilleure façon d'écrire ceActiveRecord mélange Condition + meilleure façon d'écrire ce

J'ai une condition qui précédent l'air très propre et facile à comprendre comme

Account.first.websites.last.users.find(:all, 
      :conditions => {:country => "XYZ",:status => "Single",:admin => nil) 

Maintenant, le gros problème est cet utilisateur avec admin = false n'est pas ramassé.

i.e Je veux tous les utilisateurs d'un pays spécifique, ayant le statut "Single" et admin est soit "nul" (Null dans la base de données) ou "faux".

Je parviens à obtenir le code désiré, mais ne semble pas être heureux avec la clarté de celui-ci.

Account.first.websites.last.users.find(:all, 
    :conditions => ["country = ? AND status = ? AND admin IS NULL OR 
     admin = ?","XYZ","Single","false"]) 

Toute aide serait appréciée.

grâce

+0

qu'en est-il de l'utilisation d'étendues nommées pour clarifier un peu tout? – marcgg

Répondre

1

J'ajouterais des champs d'application du modèle:

scope :not_admin, where("admin is null or admin = ?", false) 
scope :single, where("status = ?", "single") 
scope :from_country, lambda {|country| where("country = ?", country} 

utiliser ensuite dans les contrôleurs:

Account.first.websites.last.users.from_country("XYZ").single.not_admin 

Vous pouvez aussi utiliser autogénéré : champs

Account.first.websites.last.users.scoped_by_country("XYZ").scoped_by_status("single").not_admin 

Ici, je ne not_admin à gauche portée.

1

Effectuez les opérations suivantes:

Account.first.websites.last.users.all(:conditions => ["country = ? AND status = ? AND admin != true","XYZ","Single"]) 
+0

Vous devrez peut-être utiliser 'admin! =?' Et ajouter un paramètre 'true'. – Shadwell

Questions connexes