JeuWeb - Crée ton jeu par navigateur

Version complète : [Rails] Performance de validates_inclusion_of
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
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!
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).
Tu modélises les communes de France ?
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
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.
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
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