3

私は現在、Rails では非常に単純なはずの作業に苦労しています。

1 つの ActiveRecord クエリを発行し、データベースからモデル オブジェクトをフェッチし、後でそれらをハッシュに格納して後で検索できるようにしたいと考えています。

私はいくつかの調査を行いましたが、これを達成するための最適な方法を見つけられなかったので、助けていただければ幸いです。私の意図は、ループ構造でルックアップ ハッシュを使用して SQL クエリの数を減らすことです。

以下の疑似コードでは、SMS ゲートウェイからステータス コードを取得し、それらを ActiveRecord テーブルと比較して、すべてのステータス コードの説明を表示します。

#Status_codes in array format
status_codes = StatusCode.all

status_codes_hash = status_codes.to_array????

#Fetch delivery-status from sms gateway
response = HTTParty.get(myUrl)

response.each do |status|
if status_codes_hash[status.code]
    #Do stuff
end
end 
4

4 に答える 4

4

このスニペットを使用して、コードをキーとしてステータスのハッシュを取得します。

status_codes.group_by(&:code) 

スニペットはのショートカットですstatus_codes.group_by{|status| status.code}

次のようにキーをチェックすることも、より適切でより普遍的です。

if status_codes_hash.has_key?(status.code)
    # do stuff
end
于 2013-10-15T12:01:33.443 に答える
3

attributes メソッドを介してモデル インスタンスをハッシュに変換します。

StatusCode.all.map(&:attributes)
#=> [{ id: 1, code: 404, ...}, { id: 2, code: 405, ...}, ...]
于 2013-10-15T12:05:05.907 に答える
2

次のように、キーと値のペアの配列を使用してハッシュを作成できます。

Hash[/an array of key values goes here/]

したがって、StatusCodes をキーと値のペアに変換し、それを Hash[] の入力として使用するだけです。

このような

Hash[status_codes.map{|sc|[sc.code, sc]}]

トリックを行う必要があります

http://www.ruby-doc.org/core-1.9.3/Hash.html#method-c-5B-5D

于 2013-10-15T12:09:46.557 に答える
0

メソッドは、inject探していることを行う便利な方法だと思います。

status_codes_hash = status_codes.inject({}) do |hash, obj|
  hash[obj.code] = obj
end
于 2013-10-15T12:03:50.737 に答える