将过滤器应用于 ActiveModel Serializer 属性以更改密钥
Apply filter to ActiveModel Serializer attributes to change the key
我有一个序列化程序供我休息 API。目前,它看起来像:
class TestSerializer < ActiveModel::Serializer
attributes :id, :name, :field_one__c, :field_two__c
end
我想知道是否有任何方法可以过滤所有字段以在序列化时删除 __c
,如果有一种方法可以将逻辑应用于所有字段。
情况是我有很多字段的末尾是 __c
,我想在序列化程序级别使用最少的代码将它们全部删除。
是的,您可以使用 :key
选项在序列化程序中自定义属性 name:
attribute :field_one__c, key: :field_one
attribute :field_two__c, key: :field_two
您还可以使用 :if
或 :unless
选项使任何属性 有条件 。
更新:
对于你的特殊情况,你可以通过在属性列表之前定义 attributes
class 方法来解决这个问题:
class TestSerializer < ActiveModel::Serializer
class << self
def attributes(*attrs)
attrs.each do |attr|
options = {}
options[:key] = attr.to_s[0..-4].to_sym if attr.to_s.end_with?('__c')
attribute(attr, options)
end
end
end
attributes :id, :name, :field_one__c, :field_two__c
end
如果您有多个序列化器 class 具有相同的过滤大量属性的要求,您可以通过创建另一个继承自 ActiveModel::Serializer
。将上面的 class 方法定义放入这个新的序列化器中,并从这个新的序列化器继承所有序列化器,这些序列化器具有 __c
.
的属性列表
class KeyFilterSerializer < ActiveModel::Serializer
class << self
def attributes(*attrs)
attrs.each do |attr|
options = {}
options[:key] = attr.to_s[0..-4].to_sym if attr.to_s.end_with?('__c')
attribute(attr, options)
end
end
end
end
class TestSerializer < KeyFilterSerializer
attributes :id, :name, :field_one__c, :field_two__c
end
class AnotherTestSerializer < KeyFilterSerializer
attributes :id, :name, :field_one__c, :field_two__c
end
我有一个序列化程序供我休息 API。目前,它看起来像:
class TestSerializer < ActiveModel::Serializer
attributes :id, :name, :field_one__c, :field_two__c
end
我想知道是否有任何方法可以过滤所有字段以在序列化时删除 __c
,如果有一种方法可以将逻辑应用于所有字段。
情况是我有很多字段的末尾是 __c
,我想在序列化程序级别使用最少的代码将它们全部删除。
是的,您可以使用 :key
选项在序列化程序中自定义属性 name:
attribute :field_one__c, key: :field_one
attribute :field_two__c, key: :field_two
您还可以使用 :if
或 :unless
选项使任何属性 有条件 。
更新:
对于你的特殊情况,你可以通过在属性列表之前定义 attributes
class 方法来解决这个问题:
class TestSerializer < ActiveModel::Serializer
class << self
def attributes(*attrs)
attrs.each do |attr|
options = {}
options[:key] = attr.to_s[0..-4].to_sym if attr.to_s.end_with?('__c')
attribute(attr, options)
end
end
end
attributes :id, :name, :field_one__c, :field_two__c
end
如果您有多个序列化器 class 具有相同的过滤大量属性的要求,您可以通过创建另一个继承自 ActiveModel::Serializer
。将上面的 class 方法定义放入这个新的序列化器中,并从这个新的序列化器继承所有序列化器,这些序列化器具有 __c
.
class KeyFilterSerializer < ActiveModel::Serializer
class << self
def attributes(*attrs)
attrs.each do |attr|
options = {}
options[:key] = attr.to_s[0..-4].to_sym if attr.to_s.end_with?('__c')
attribute(attr, options)
end
end
end
end
class TestSerializer < KeyFilterSerializer
attributes :id, :name, :field_one__c, :field_two__c
end
class AnotherTestSerializer < KeyFilterSerializer
attributes :id, :name, :field_one__c, :field_two__c
end