Cette recherche va être extrêmement inefficace. Si vous envisagez de faire beaucoup de recherches d'e-mails, il peut être prudent d'ajouter une colonne indexée pour stocker l'e-mail dans votre tableau.
Je suppose que contents
est un champ de texte pour stocker un hachage sérialisé. Les hachages sont sérialisés en utilisant le format YAML, qui est en texte brut. Vous pouvez donc effectuer les recherches de caractères génériques sur la colonne content
.
Par exemple: Un hachage comme illustré ci-dessous
{"email" => "[email protected]"}
est sérialisé pour chaîne
"--- \nemail: [email protected]\n"
Vous pouvez écrire simple matcher comme suit:
Email.all(:conditions => ["content LIKE ? ", "%email: #{email}%"])
Si vous envisagent d'interroger plusieurs champs dynamiques puis,
class Email < ActiveRecord::Base
def self.find_all_by_dynamic(hash)
ca = hash.map {|k, v| ["contents LIKE ?", "%#{k}: #{v}%"]}.transpose
Email.all(:conditions => [ca[0].join(" AND "), *ca[1]])
end
end
Maintenant, vous pouvez utiliser la nouvelle méthode comme:
Email.find_all_by_dynamic(:email => "[email protected]", :zip => 94307)
Thanx KandadaBoggu. Il devrait y avoir hash.map au lieu de map uniquement. – a5his