【问题标题】:Rails 4 — How to populate a user model from JSON API?Rails 4 — 如何从 JSON API 填充用户模型?
【发布时间】:2013-12-13 15:46:11
【问题描述】:

首先,我是 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?

非常感谢您的帮助。

【问题讨论】:

  • 命名范围只是不同查询条件的快捷方式,例如:scope :only_active, where(active: true) 用于调用MyModel.only_active,它返回符合条件 active = true 的 MyModel 对象列表。与属性赋值无关。

标签: ruby-on-rails ruby ruby-on-rails-4 named-scope rails-api


【解决方案1】:

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

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

您可以将其映射到Users 的数组中:

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

【讨论】:

  • +1 我的回答没有考虑到数据包含多个用户,现在在这个中得到了启发。
  • +1 && 我会在这里添加一个安全功能,因为它使用的 API 可能会带来一些错误的用户输入:users = response.map{ |h| User.new( h.slice(*User.column_names) ) } -> 这仅授权用户模型的属性。
【解决方案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 以获取安全建议。

【讨论】:

  • 谢谢。快速提问,这里的数组有什么意义,因为每次调用 populate 方法都会覆盖它?
  • 用户已暂时填充,返回暂时填充用户的数组,以便您可以在视图中使用它们。 assign_attributes 没有接触数据库。
  • 我假设您的意思是 temporarily,并且您并不是在建议任何时间旅行解决方案 :)
【解决方案3】:

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

附:在 Rails 4 中,它转到 gem https://github.com/rails/activeresource

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 谢谢。问题是我想填充虚拟属性,这不需要更改或“更新”数据库。
    猜你喜欢
    • 2016-05-17
    • 2020-05-10
    • 1970-01-01
    • 2019-01-29
    • 2016-03-14
    • 1970-01-01
    • 2015-05-30
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多