将哈希对象值作为搜索参数传递

时间:2010-10-08 03:59:02

标签: ruby-on-rails search activerecord hash

我有一个带有“内容”字段的“电子邮件”表,其中数据存储为哈希对象。我想在此表中使用参数“email => a5his@gmail.com”进行搜索,其中:email是密钥,“a5his@gmail.com”是哈希对象的值。

提前致谢

1 个答案:

答案 0 :(得分:1)

这种搜索效率极低。如果您计划对电子邮件进行大量搜索,那么添加索引列以将电子邮件存储在表中可能是明智的。

我假设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)