2017-02-22 334 views
-1

我有2個查詢結果其中之一是散列這樣合併2陣列

[{"user_id"=>"1", "latlng"=>[#<BigDecimal:7fc67f8412d0,'0.43653226E2',18(36)>, #<BigDecimal:7fc67f840560,'-0.793831843E2',18(36)>], "loc"=>["Toronto", "Ontario", "Canada"]}, {"user_id"=>"2", "latlng"=>[#<BigDecimal:7fc67f84a8f8,'0.43653226E2',18(36)>, #<BigDecimal:7fc67f849d18,'-0.793831843E2',18(36)>], "loc"=>["Toronto", "Ontario", "Canada"]}, {"user_id"=>"3", "latlng"=>[#<BigDecimal:7fc67f848828,'0.43653226E2',18(36)>, #<BigDecimal:7fc67f848210,'-0.793831843E2',18(36)>], "loc"=>["Toronto", "Ontario", "Canada"]}, {"user_id"=>"4", "latlng"=>[#<BigDecimal:7fc67f852620,'0.43653226E2',18(36)>, #<BigDecimal:7fc67f851b30,'-0.793831843E2',18(36)>], "loc"=>["Toronto", "Ontario", "Canada"]}, {"user_id"=>"5", "latlng"=>[#<BigDecimal:7fc67f85ae88,'0.43653226E2',18(36)>, #<BigDecimal:7fc67f85a9b0,'-0.793831843E2',18(36)>], "loc"=>["Toronto", "Ontario", "Canada"]}]

二是用戶的一個有效記錄的關係的對象陣列,

<ActiveRecord::Relation [#<User id: 4, email: "[email protected]", username: "steve", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 13, current_sign_in_at: "2017-02-18 21:16:17", last_sign_in_at: "2017-01-14 20:32:57", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmed_at: "2016-12-13 01:42:57", confirmation_sent_at: "2016-12-13 01:42:55", unconfirmed_email: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, created_at: "2016-12-13 01:42:55", updated_at: "2017-02-18 22:03:46", slug: "user2", uuid: "xdn5n5z3fmr4", impressions_count: 1, likers_count: 3, lat: #<BigDecimal:7fc67fc39130,'0.0',9(27)>, lng: #<BigDecimal:7fc67fc38c30,'0.0',9(27)>, currently_online: false, status: "unverified", deleted_at: nil>, #<User id: 5, email: "[email protected]", username: "user21", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2017-02-17 02:49:07", last_sign_in_at: "2017-02-17 02:49:07", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmed_at: "2017-02-17 02:49:10", confirmation_sent_at: "2017-02-17 02:49:07", unconfirmed_email: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, created_at: "2017-02-17 02:49:07", updated_at: "2017-02-17 02:49:43", slug: "user21", uuid: "xtffdh2ajnp7", impressions_count: 1, likers_count: 0, lat: #<BigDecimal:7fc67fca6758,'0.0',9(27)>, lng: #<BigDecimal:7fc67fca5ec0,'0.0',9(27)>, currently_online: false, status: "unverified", deleted_at: nil>]>

我想要做的,就是散列的第一陣列合併成基於第一陣列的外鍵ActiveRecord的關係,

因此,如果第一個數組的user_id爲3,我想要將該散列插入活動記錄對象上ID爲3的用戶的活動記錄中。

我想出了這個

index = a1.group_by{|entry| entry["id"]} i2= a2.map{|entry| (index[entry.id] || []).reduce(entry, :merge) }

,但它不是一起合併他們所有..我究竟做錯了什麼?

編輯:不是所有的第一陣列的是培訓相關的,我只希望基於什麼第二個查詢的活動記錄收集返回

EDIT2選擇性地獲取來自第一陣列的項目:我不是在尋找爲了保存數據,我只想合併數據集以將其顯示回視圖模板中。

回答

0

如果我理解正確的話,你可以這樣做:

# users is an array of ActiveRecord::Relation 
# extra_data is the hash 
users.each do |user| 
    # .detect basically will return an object (first appearance) or nil 
    data = extra_data.detect{|d| d["user_id"].to_i == user.id} 
    if data.present? 
    user.lat = data["latlng"][0] 
    user.lng = data["latlng"][1] 
    # if you want to attach "loc", add a attr_accesor :loc in your Use model 
    # user.loc = data["loc"] 
    end 
end 

如果您想了解更多關於detect方法,read the docs

+0

謝謝!我用這個和@ mysmallidea的回覆使它對我有用。 –

1

如果在集合上使用Array#mapcollect,那麼最終會得到一個數組而不是ActiveRecord集合,這可能不是您想要的。

你可以虛擬屬性添加到用戶模型,然後遍歷集合:

# app/models/user.rb 
attr_accessor :latlon, :loc 

users.each do |user| 
    if location = location_array[user.id.to_s] 
    user.latlon = location['latlng'] 
    user.loc = location['loc'] 
    end 
end 

這可能不會是非常有效的,但對於一個小的分頁數據集可能不是一個大問題。

另一種選擇是使用decorator pattern,它的作用類似於用戶對象的包裝。在這種情況下,您可以將您的位置屬性添加到修飾器,而不是將它們注入到集合中。仔細看看Draper寶石。

+0

感謝您的建議!但是我並沒有將它保存到數據庫中,我只需要把這個集合顯示回給用戶,所以如果它的活動記錄集合無關緊要 –

+0

在任何情況下,上述解決方案都不會將它保存到數據庫 - 它只是將可訪問的屬性添加到用戶集合中的每個項目中。 – mysmallidea

+0

你試過這個解決方案嗎?正如我所說的,它不會將其保存回數據庫,它只是將其作爲集合中每個對象的虛擬屬性添加。如果這不是你想要的,請澄清你的問題。 – mysmallidea