7

首先,我是 Rails 新手,如果有任何我不正确理解的地方,我深表歉意。我想知道如何通过 API 获取数据来填充模型。

上下文:我正在使用 OAuth2 身份验证和omniauth/devise。

在我的用户控制器客户端(与提供程序相对)中,我获取了至少登录一次的所有用户是这个“客户端应用程序”,我想显示它们。显然,每当新用户登录客户端应用程序时,我不会将他的所有信息存储在客户端数据库中以避免重复。我存储的只是 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?

非常感谢您的帮助。

4

4 回答 4

12

假设这response是一个属性哈希数组:

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

您可以将其映射到 s 数组中User

users = response.map{|h| User.new(h)}
于 2013-12-17T01:40:34.120 回答
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文档以获取安全建议。

于 2013-12-16T11:21:20.427 回答
2

最简单的方法是使用 active_resource http://railscasts.com/episodes/94-activeresource-basics

PS 在 Rails 4 中,它去了 gem https://github.com/rails/activeresource

于 2013-12-17T09:28:17.017 回答
1

我没有找到直接的方法,我可以建议的最短解决方案是使用以下方法update

ids = get.map{ |e| e["id"] }
User.update(ids, get)
于 2013-12-13T16:49:43.327 回答