首先,我是rails的新手,很抱歉,如果有任何我不理解的话。我想知道如何通过API填充数据获取模型。
上下文:我正在使用omniauth / 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 :(得分:12)
假设response
是一个属性哈希数组:
[{'id' => 1, 'name' => 'Dave'}, {'id' => 2, 'name' => 'Bill'}]
您可以将其映射到User
s的数组中,其中包含:
users = response.map{|h| User.new(h)}
答案 1 :(得分: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是否有安全建议。
答案 2 :(得分:2)
最简单的方法是使用active_resource http://railscasts.com/episodes/94-activeresource-basics
P.S。在Rails 4中,它已进入gem https://github.com/rails/activeresource
答案 3 :(得分:1)
我找不到直接的方法,我建议的最短解决方案是使用方法update
:
ids = get.map{ |e| e["id"] }
User.update(ids, get)