仅指定所需的JSON密钥作为ActiveModel :: Serializers属性

时间:2014-08-03 20:35:01

标签: ruby-on-rails json active-model-serializers

使用ActiveModel :: Serializers解析JSON API时,有没有办法不必将JSON中的每一个键都指定为属性?

说我的观点只需要:first_name, :last_name, :country - 除非我还在JSON中指定其他键:street_address, :postal_code, :phone, :email,否则我会得到未定义的方法' street_address ='对于#。

我发现http://bigastronaut.com/blog/2014/don-t-serialize-just-a-few-give-me-all-attributes但他的公关尚未被接受:https://github.com/rails-api/active_model_serializers/pull/535 - 我还能做些什么吗?

class GetFromJson
  include ActiveModel::Serializers::JSON

  attr_accessor :first_name, :last_name, :country # :street_address, :postal_code, :phone, :email

  def attributes=(hash)
    hash.each do |key, value|
      send("#{key}=", value)
    end
  end

  def self.fetch

    # Code to fetch JSON from API

  end
end

1 个答案:

答案 0 :(得分:1)

我认为最好直接在序列化程序中定义你想要的东西,但我可以看出你的观点,在某些情况下这可能很烦人......你可以做的一件事就是为每个列名定义所有的attr_accessors在模型中,如果序列化程序应该序列化特定的ActiveRecord模型,那么。

例如,假设您有一个名为Person的AR模型,只需编写Person.column_names即可找到该对象的所有数据库属性,这不会为您提供虚拟属性。想要,但至少'默认为您提供所有数据库属性'

所以它会是这样的:

class PersonSerializer < ActiveModel::Serializer
  Person.column_names.each {|pcn| attributes pcn}

  #...define other virtual attributes here, etc.
end