1

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です。

4

3 に答える 3

2

これは仕事をするはずです:

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

短いバージョン:

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

必要に応じて a を追加する必要がある場合があり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

ご覧のとおり、これはデータを保存する良い方法ではありません。インデックスを利用することはできず、すべてのクエリで文字列内検索を行う必要があり、これは非常に非効率的です。代わりに、テーブルを必要なフィールドに分割するか、可変ストレージ用のテーブルを作成してください。私が呼び出すテーブルのスキーマとして、次のようなものを使用します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 に答える
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 に答える