【问题标题】:passing hash object values as search parameter将哈希对象值作为搜索参数传递
【发布时间】:2010-10-08 03:59:02
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: ruby-on-rails search activerecord hash


    【解决方案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)
    

    【讨论】:

    • 感谢 KandadaBoggu。应该有 hash.map 而不是只有 map。
    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 2021-10-19
    • 1970-01-01
    • 2012-05-18
    • 2010-12-21
    • 2022-06-10
    • 2020-06-05
    • 2011-01-31
    相关资源
    最近更新 更多