2016-11-28 35 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

再一次,即使成功重寫,它不符合我們明確提及的領域,我們需要的目的! –