2010-12-03 3 views
0

J'ai un formulaire qui est utilisé pour filtrer les requêtes. Certains des attributs de formulaire sont facultatifs. Je me demande simplement comment les ajouter en tant que conditions d'enregistrement si (et seulement si) ils ont une valeur fixe? Il y en a un bon nombre, donc je préfère ne pas faire une requête séparée pour chaque modèle de valeurs potentielles. Aucune suggestion?Rails Débutant: Ajout de conditions dans activeecord?

Pour donner un exemple précis:

people = People.paginate(
    :all, 
    :include => [:people_postcodes, :people_specialties, :people_states], 
    :conditions => ["people_specialties.people_type_id = %s AND (people_postcodes.postcode_id = %s OR people_states.state_id = %s)" % [self.people_type_id, postcodeid.id, stateid]], 
    :page => page, 
    :per_page => 16 
) 

Comment pourrais-je mieux s'y prendre pour créer une condition supplémentaire (dire « nationalité ») attribut que si l'option « nationalité » est peuplée?

Répondre

2

Tout d'abord, vos conditions sont un peu précaires. Vous faites une substitution basique de texte ruby, qui permettra aux utilisateurs du site d'injecter n'importe quel SQL malveillant qu'ils veulent. Au lieu de cela, formater comme ceci:

people = People.paginate(
    :all, 
    :include => [:people_postcodes, :people_specialties, :people_states], 
    :conditions => ["people_specialties.people_type_id = ? AND (people_postcodes.postcode_id = ? OR people_states.state_id = ?)", self.people_type_id, postcodeid.id, stateid], 
    :page => page, 
    :per_page => 16 
) 

Pour répondre à votre question, il n'y a pas moyen naturel de virer de bord sur une autre condition dans Rails 2.x. Je ferais ceci:

conditions = ["people_specialties.people_type_id = ? AND (people_postcodes.postcode_id = ? OR people_states.state_id = ?)", self.people_type_id, postcodeid.id, stateid] 

if params[:nationality] 
    conditions.first += " and nationality = ?" 
    conditions.push params[:nationality] 
end 

people = People.paginate(
    :all, 
    :include => [:people_postcodes, :people_specialties, :people_states], 
    :conditions => conditions, 
    :page => page, 
    :per_page => 16 
) 

Dans l'exemple ci-dessus, je suppose la nationalité est passée en paramètre, mais ajuster au besoin. Je crée le tableau de conditions d'origine, puis j'ajoute le premier élément (la chaîne de condition actuelle) et j'ajoute un élément de plus à la fin du tableau: la valeur de nationalité.

J'espère que cela aide!

+0

+1 pour les informations sur l'injection SQL. Souhait qu'il y avait un tag (?) Sur SO appelé "Code dangereux" de sorte que les débutants (et certains oldies) sauraient que le code est "dangereux" – Zabba

+0

Parfait - merci beaucoup. Aussi: arghh - Je pensais que les chaînes étaient automatiquement échappées en SQL; déteste que j'ai raté ça. Je viens juste d'apprendre les rails, surtout en parcourant d'autres codes source, mais c'est la deuxième fois que j'ai raté un problème de sécurité (était complétement inconscient de attr_accessible pour le premier mois). J'ai eu du mal à trouver une solide liste de problèmes de sécurité sur les rails et je suis un peu inquiet de ne pas pouvoir en trouver d'autres. Des suggestions sur où trouver un aperçu des problèmes de sécurité des rails communs? – PlankTon

Questions connexes