JeuWeb - Crée ton jeu par navigateur
[Rails] Performance de validates_inclusion_of - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Rails] Performance de validates_inclusion_of (/showthread.php?tid=5773)



[Rails] Performance de validates_inclusion_of - popayan - 27-10-2011

Bonjour,

Une petite question :

Posons d'abord le contexte : j'ai un champ city dans un model ainsi qu'une table "Cities".
Le champ city doit impérative contenir une donnée présente dans la table "Cities" d'où le fait de vouloir utiliser le validates_inclusion_of.
Sauf que ma table "Cities" a environ 35000 entrées!
D'où la question, est-ce dangereux d'utiliser cette méthode avec "autant" de données. (Je mets "autant" entre guillemets parce que je ne sais si 36000 est un chiffre si important que ca pour ce genre de chose...)

Merci d'avance!


RE: [Rails] Performance de validates_inclusion_of - Sephi-Chan - 27-10-2011

Montre le code précis que tu utilises. Wink

Et dans une console, crée un nouvelle ressource qui a cette association et regarde la requête effectuée lorsque tu la sauvegarderas (puisque c'est là que sera effectuée la validation).


RE: [Rails] Performance de validates_inclusion_of - niahoo - 27-10-2011

Tu modélises les communes de France ?


RE: [Rails] Performance de validates_inclusion_of - popayan - 27-10-2011

Je n'ai pas encore fait la partie validation, juste la partie autocomplétion du champ, je finirais ca demain et je vous montre.
Sinon oui, ce sont les communes de France


RE: [Rails] Performance de validates_inclusion_of - Sephi-Chan - 27-10-2011

Pourquoi ne pas plutôt avoir une colonne city_id dans ton modèle plutôt qu'une chaîne de caractère (par définition moins fiable) ?

Le validateur validates_inclusion_of est plus approprié pour les petites listes (homme/femme, true/false, rouge/vert/bleu, etc.). Là je pense que le plus efficace serait une validation manuelle.


class User < ActiveRecord::Base
belongs_to :city
validate :city_exists


def city_exists
errors[:city_id] = :inclusion unless City.exists?(city_id)
end
end

En plus ça utilisera le même message d'erreur que si la validation foirait avec un validates_inclusion_of.


RE: [Rails] Performance de validates_inclusion_of - popayan - 27-10-2011

La "city" est surtout là pour la déco et ne servira a rien (ou presque) ensuite... donc je me suis dis que lié des tables en plus était inutile.

Sur ce que j'avais lu sur validates_inclusion_of, ça rejoint ce que tu dis (c'est pour ça que je posais la question ^^) et du coup, je vais me tourner vers cette méthode


RE: [Rails] Performance de validates_inclusion_of - Sephi-Chan - 27-10-2011

Oui mais si tu as les villes stockées dans ta table Cities, autant les référencer par leur id plutôt que par leur nom. Ça ne coûte pas plus cher et c'est plus efficace. Smile

Si tu préfères malgré tout utiliser une chaîne :


class User < ActiveRecord::Base
validate :city_exists


def city_exists
errors[:city_id] = :inclusion unless City.exists?(name: city)
end
end