删除' created_at'和' updated_at'来自所有json呈现的全局覆盖' serializable_hash'

时间:2016-11-28 08:11:49

标签: json timestamp active-model-serializers rails-api

我只是发现rails_timestamps膨胀了我的所有请求,实际上在很多情况下,没有。时间戳占用的字符数量超过了我们实际需要的原始内容。

经过大量关于断点的调试后,我终于覆盖serializable_hash而不是覆盖as_json,当使用:include =>时,它似乎不会被称为递归

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  # Ignore created_at and updated_at by default in JSONs 
  # and when needed add them to :include
  def serializable_hash(options={})
    options[:except] ||= []
    options[:except] << :created_at unless (options[:include] == :created_at) || (options[:include].kind_of?(Array) && (options[:include].include? :created_at))
    options[:except] << :updated_at unless (options[:include] == :updated_at) || (options[:include].kind_of?(Array) && (options[:include].include? :updated_at))

    options.delete(:include) if options[:include] == :created_at
    options.delete(:include) if options[:include] == :updated_at
    options[:include] -= [:created_at, :updated_at] if options[:include].kind_of?(Array)

    super(options)
  end

end

到目前为止,它对我所有的基本到中等需求都很有效,但后来我明白我需要继续使用active-model-serializers,但是从文档开始,似乎正在使用serializable_hash`在很多地方(幸运的是它可以在没有破坏的情况下工作..)我是以正确的方式做的吗?

  

这是否会破坏我的代码 ?我应该面对什么后果?

我对此有疑问:

  • 是否特别需要那些&#39; created_at&#39;和&#39; updated_at&#39;时间戳? AFAIK我还没有详尽地使用它们:我只使用像Orders这样的模型来获取或更新订单。

  • 是否有一种简单的方法可以在默认情况下关闭这些时间戳,:include仅在需要时 ,就像我们对associated_models所做的那样?像

    这样的东西
    # serializers/application_serializer.rb
    class ApplicationSerializer < ActiveModel::Serializer
        except: :created_at, :updated_at
        except: :id  #in case we have uid-hash for all models and we don't want to send id for all models
        except: :common_attrib_for_all_models
    end
    

    serializable_hash中的models/application_record.rb内的类似内容?

1 个答案:

答案 0 :(得分:0)

尝试添加serializers / application_serializer.rb

def filter(keys)
  keys.delete :created_at, :updated_at
  super(keys)
end