2016-11-28 38 views
0

我只是发现rails_timestamps会膨胀我的所有请求,事实上在很多情况下,不会。时间戳消耗的字符数多于我们实际需要的原始内容数量。通过覆盖'serializable_hash'从全部json渲染中删除'created_at'和'updated_at'

很多调试用的断点后,我终于重写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`正在许多地方使用(并且幸运的是它的工作原理没有突破到目前为止。)我正确的做法吗?

这是否打破我的代码随时随地?我应该面对什么后果?


问题我有一个关于这一点:

  • 是否有那些 'created_at' 和 '的updated_at' 时间戳特定的需求? 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 
    

    models/application_record.rbserializable_hash类似的东西?

回答

0

尝试增加在串行器/ application_serializer.rb

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

如果我使用'serializers',我需要创建'serializer'每个模型,做这将迫使我明确说明什么属性我需要_(显然不包括** created_at **和** updated_at **)_因此无需全局覆盖来排除字段...! –

+0

,不幸的是'过滤器'也**不适合我**!从[repo]的结果(https://github.com/rails-api/active_model_serializers/search?utf8=%E2%9C%93&q=filter),它看起来像'json_api/deserialisation.rb'上的'filter_fields'是可以覆盖的。我用'filter_fields'尝试了你的解决方案,但仍然无法工作......我在'Rails 5.0.0.1'上使用'Ruby 2.3'和'Active Model Serializers 0.10.3' –

+0

再一次,即使成功重写,它不符合我们明确提及的领域,我们需要的目的! –