0

ユーザーモデルとアドレスモデルがあります。@user=User.all を実行すると返されます

  {  "id" : "1",
    "firstname" : "test",
    "username" : "test",   
  },
  {  "id" : "2",
    "firstname" : "test1",
    "username" : "test2",       
  }  

そして私がするとき@address =Address.all

{   "id" : "21",
    "user_id" : "1",
    "city" : "test",
    "country" : "test",   
  },
  {  "id" : "22",
     "user_id" : "2",
     "city" : "test1",
     "country" : "test2",       
  }  

私は値を超えます

ここで、@user と @address の両方の値を単一のハッシュにマージしたいと考えています。元のように

   {  "id" : "1",
     "firstname" : "test",
     "username" : "test",   
     "id" : "22",
     "user_id" : "1",
     "city" : "test1",
     "country" : "test2",   
    },
   {  "id" : "2",
     "firstname" : "test2",
     "username" : "test2", 
     "id" : "22",
     "user_id" : "2",
     "city" : "test1",
     "country" : "test2",         
   }    

これを行う方法?

4

2 に答える 2

1

1 つの配列を「id」でハッシュにインデックス付けします。

users_by_id = {}
@users.each {|h| users_by_id[h['id']] = h}

次のステップでは、2 番目のハッシュにマージします。

@address.map do |address| 
   # search the user with the same id
   u = users_by_id[address['user_id']]
   if u
     # rename 'id' key
     u['uid'] = u['id']
     address.merge(u)
   else
     address # no user matched!
   end
end
于 2013-06-10T19:10:24.107 に答える
1

この問題を解決する方法の 1 つは、select 句で重複する列にエイリアスを設定することです。住所モデルの場合、各レコードをプルアップすると、次のことができます。

@addresses = Address.select("id AS address_id, user_id, city, country").all

これで、アドレス モデル ハッシュの ID 列がユーザー ハッシュの ID 列と競合しなくなりました。次に、Neil Slater が提案したように、以下を使用してそれらをマージできます。

combo_hash = user_hash.merge(address_hash)
于 2013-06-10T19:14:52.253 に答える