2013-12-13 109 views
6

首先,我對軌道很陌生,所以很抱歉,如果有任何我不明白的地方。我想知道如何填充通過API獲取數據的模型。Rails 4 - 如何從JSON API填充用戶模型?

上下文:我正在使用omuthuth/devise進行OAuth2身份驗證。

在我的用戶控制器客戶端(與提供者相反),我提取了至少一次登錄的所有用戶是這個「客戶端應用程序」,我想顯示它們。顯然,無論何時,新用戶登錄到客戶端應用程序,我都不會將所有信息存儲在客戶端數據庫中以避免重複。我所存儲的全部是user_id及其訪問令牌。

因此,我想在獲取所有用戶數據後,我可以在將它傳遞給視圖之前將它們填充到用戶模型中。做這樣的事情最好的方法是什麼? 我正在研究命名範圍,但我不清楚如何將它應用於我的特定場景。舉例來說,這將是偉大的,是能夠獲取一個填入使用這樣的事情在我的模型的所有用戶:

# ApiRequest is a container class for HTTParty 
get = ApiRequest.new.get_users(User.all) // here "get" is a JSON array of all users data 
response = get.parsed_response['users'] 
User.populate(response).all # would something like this possible? If yes, is Named Scope the appropriate solution? 

非常感謝您提前爲您提供幫助。

+0

命名作用域僅僅是不同查詢條件的快捷方式,例如:'scope:only_active,where(active:true)'通過調用'MyModel.only_active'來使用,它返回列表關於條件active = true的MyModel對象。它與屬性分配無關。 – MrYoshiji

回答

1

我沒有找到一個直接的方式來做到這一點,我可以建議最短的解決方案是使用方法update

ids = get.map{ |e| e["id"] } 
User.update(ids, get) 
+0

謝謝。問題是我想填充虛擬屬性,這不應該需要修改或「更新」數據庫。 – user3099958

2

如果你不想碰數據庫,也想填充虛擬屬性,我認爲唯一的辦法就是實現自己的populate方法:

# The User class 
def self.populate(data) 
    data.map do |user_json| 
    user = User.find(user_json[:id]) 
    user.assign_attributes(user_json) 
    user 
    end 
end 

檢查assign_attributes documentation安全建議。

+0

謝謝。快速的問題,這裏的數組有什麼意義,因爲每次調用populate方法都會被重寫。 – user3099958

+0

用戶被填充_temporally_,具有_temporally_填充用戶的數組將返回,因此您可以在視圖中使用它們。 'assign_attributes'沒有觸及數據庫。 – fguillen

+0

我假設你的意思是'暫時的',並且你不是建議任何類型的時間旅行解決方案:) – pguardiario

8

假設response是屬性的數組散列:

[{'id' => 1, 'name' => 'Dave'}, {'id' => 2, 'name' => 'Bill'}] 

可以映射到這一點的User s的磁盤陣列:

users = response.map{|h| User.new(h)} 
+0

+1我的答案沒有考慮到數據包含多個用戶,現在固定在這一個啓發。 – fguillen

+0

+1 &&我會在這裏添加一個安全特性,因爲它使用的API可能會帶來一些不好的用戶輸入:'users = response.map {| h | User.new(h.slice(* User.column_names))}' - >這隻授權用戶模型的屬性。 – MrYoshiji

+0

看起來像一個很好的解決方案給我! – Liyali