Этот поиск будет крайне неэффективным.Если вы планируете выполнять поиск по электронной почте, было бы целесообразно добавить индексированный столбец для хранения электронной почты в вашей таблице.
Я предполагаю, что contents
- это текстовое поле для хранения сериализованного хэша,Хэши сериализуются в формате YAML, который представлен в виде простого текста.Таким образом, вы можете выполнять обычный поиск по шаблону в столбце content
.
Например: хэш, как показано ниже
{"email" => "a5his@gmail.com"}
, сериализуется в строку
"--- \nemail: a5his@gmail.com\n"
Таким образом, вы можете написать простое сопоставление следующим образом:
Email.all(:conditions => ["content LIKE ? ", "%email: #{email}%"])
Если вы планируете запросить несколько динамических полей, тогда
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
Теперь вы можете использовать новый метод как:
Email.find_all_by_dynamic(:email => "5his@gmail.com", :zip => 94307)