1

我的表中有一个variables字段,将杂项数据存储在哈希中。

我需要做的是遍历所有行以查找正在使用的键。

例如,这里有 3 个示例说明该variables字段可以包含的内容...

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.

4

3 回答 3

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]
于 2013-06-25T18:09:51.107 回答
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]
于 2013-06-25T19:03:10.173 回答
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 将使这成为一个微不足道的搜索。

于 2013-06-25T21:13:08.170 回答