【问题标题】:Using ActiveModel::Serializer How Can I Add a table attribute to each model使用 ActiveModel::Serializer 如何为每个模型添加表属性
【发布时间】:2015-12-13 20:39:17
【问题描述】:

我希望为每个模型返回的 JSON 包含一个表属性,指示对象来自的数据库表(对于 STI,这与模型类不同)并查找适当的工厂函数以实例化对象。

我想我可以手动覆盖每个序列化程序的表属性,但这看起来真的很难看。一般有什么办法可以做到吗?

【问题讨论】:

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


    【解决方案1】:

    这行得通。

    让我所有的序列化程序都继承自以下:

    class ApplicationSerializer < ActiveModel::Serializer
    
      attributes :table_name
    
      def table_name
          object.class.table_name
      end
    end
    

    【讨论】:

      【解决方案2】:

      一个好的解决方案是扩展ActiveRecord::Base,覆盖attributes 方法,然后使用继承。

      扩展 ActiveRecord::Base 和覆盖。

      class ActiveRecordExtension < ActiveRecord::Base
          self.abstract_class = true
      
          def attributes
              res = super
              res["class_name"] = class_name
              res 
          end
      
          def class_name
              self.class.name
          end
      end
      

      继承

      class User < ActiveRecordExtension
      end
      

      您也可以创建一个猴子补丁,但继承更整洁。在猴子补丁中唯一有用的是您不会将继承从 ActiveRecord::Base 更改为另一个类。

      我没有使用ActiveModel::Serializer,但如果您坚持使用它,您可以了解更多关于它的信息in this cast,尽管我猜每个模型都需要一个序列化程序,而我的解决方案是。

      【讨论】:

      • 只是一个小小的挑剔。我相信这会添加类名而不是表。这很容易改变,我只是觉得我应该指出来。更令人不安的是,这搞砸了我的模型中对属性调用的任何使用。拥有序列化器的目的是分离模型逻辑和序列化关注点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多