0

次のような値を返すAPI呼び出しからハッシュを取得しています。

[{"name"=>"Abby Allen", "id"=>"123"}, {"name"=>"Barry Burner", "id"=>"234"}, {"name"=>"Cat Catrelli", "id"=>"345"}, {"name"=>"Darrell Dogooder", "id"=>"456"}, {"name"=>"Eva Ewing", "id"=>"567"}]

このハッシュのIDを、データベース(ユーザーモデル)に現在ある「apiid」列と比較し、ハッシュと「apiid」列に共通するすべてのIDを返します。

つまり、ユーザーモデルのapiid列は次のようになります

apiid
001
123
125
333
345

私はそれをこのように試していましたが、どんな提案でもそれを機能させることができません。最終的にはapiid列が長くなるので、最も効率的な方法も探しています。

User.find_each(:select => "apiid") do |user|
  @friendscommon = @friends.select{|key, hash| hash["id"] == user }
end

ここで、@friendsは上記のハッシュです。

任意の提案をいただければ幸いです。ありがとうございました!

4

1 に答える 1

2

ハッシュの配列内のすべてのIDの配列を抽出する必要があります。

apiids = hash.map { |user| user["id"] }

これにより、apiidはidの配列になります。つまり、次のようになります。

apiids = ["123","234","345","456","567"]

そしてそれをクエリに渡します:

User.select(:apiid).where(:apiid => apiids)

ここで、where句は効果的に次のことを確認します。

where(:apiid => ["123","234","345","456","567"])

これは次のように解釈されます。

SELECT apiid FROM users WHERE (users.apiid IN ("123","234","345","456","567"))
于 2012-08-17T15:00:14.253 に答える