我的表中有一个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
。
答案 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会使这一切变得微不足道。