在多个记录中查找哈希键

时间:2013-06-25 18:06:50

标签: ruby-on-rails ruby

我的表中有一个variables字段,用于存储散列中的杂项数据。

我需要做的是遍历所有行,找到正在使用的密钥。

例如,以下是variables字段可以容纳的3个示例...

Row 1: {:email=>"bob@example.com", :user_id=>"13", :last_seen=>"January 14, 2013"}
Row 2: {:user_id=>"13", :last_seen=>"January 14, 2013", :favorite_color=>"red"}
Row 3: {:order_count=>87}

所以,我想要的钥匙是:email, user_id, last_seen, favorite_color, order_count

3 个答案:

答案 0 :(得分:2)

这应该做的工作:

all_keys = variables.map{ |hash| hash.keys }.flatten

较短的版本:

all_keys = variables.map(&:keys).flatten

您可能需要添加uniq作为您的意愿

我的IRB控制台(1.9.3)中的回溯:

a = [ {a: 1, b: 2}, {c: 4, a: 3} ]
#=> [{:a=>1, :b=>2}, {:c=>4, :a=>3}]
a.map(&:keys).flatten
#=> [:a, :b, :c, :a]

答案 1 :(得分:0)

Enumerable#flat_map是处理此类案例的好方法。

ar = [
    {:email=>"bob@example.com", :user_id=>"13", :last_seen=>"January 14, 2013"},
    {:user_id=>"13", :last_seen=>"January 14, 2013", :favorite_color=>"red"},
    {:order_count=>87}
]

ar.flat_map(&:keys).uniq
# => [:email, :user_id, :last_seen, :favorite_color, :order_count]

答案 2 :(得分:0)

正如您所看到的,这不是存储数据的好方法。您无法利用索引,并且每个查询都必须进行字符串搜索,这非常低效。相反,将表中断到您需要的字段,或创建一个用于变量存储的表。我会使用这样的东西作为我称之为user_vars的表格的模式:

id integer
user_id integer
var_name string
var_value string

使用user_id,您可以找到与特定用户关联的所有变量。从搜索结果中可以看出:

select var_name, var_value from user_vars where user_id = 1;

您将获得该用户的所有变量。

使用:

select var_name, var_value from user_vars where user_id = 1 and var_name in ('email', 'user_id', 'last_seen', 'favorite_color', 'order_count');

您只能获得特定用户所需的记录。

可以为所有字段设置索引,因此您的数据库可以非常快速地找到内容。

Active Record会使这一切变得微不足道。