Как вернуть все атрибуты объекта с помощью Rails Serializer?

У меня простой вопрос. У меня есть сериализатор, который выглядит так:

class GroupSerializer < ActiveModel::Serializer
  attributes :id, :name, :about, :city 
end

Проблема в том, что всякий раз, когда я меняю свою модель, мне приходится добавлять/удалять атрибуты из этого сериализатора. Я просто хочу получить весь объект по умолчанию, как в ответе json рельсов по умолчанию:

render json: @group

Как я могу это сделать?


person Salah Saleh    schedule 27.03.2015    source источник
comment
Можно поподробнее.. в чем проблема. Вы имели в виду, что не хотите вводить имена атрибутов вручную вот так attributes :id, :name, :about, :city ?   -  person Arup Rakshit    schedule 27.03.2015
comment
Да, точно. Я просто хочу, чтобы весь объект возвращался по умолчанию. Я также хочу исключить вещи, если это необходимо.   -  person Salah Saleh    schedule 27.03.2015


Ответы (5)


По крайней мере, на 0.8.2 ActiveModelSerializers вы можете использовать следующее:

class GroupSerializer < ActiveModel::Serializer
  def attributes
    object.attributes.symbolize_keys
  end
end

Будьте осторожны с этим, так как он добавит каждый атрибут, который ваш объект прикрепил к нему. Вы, вероятно, захотите добавить некоторую логику фильтрации в свой сериализатор, чтобы предотвратить отображение конфиденциальной информации (например, зашифрованные пароли и т. д.).

Это не относится к ассоциациям, хотя, немного покопавшись, вы, вероятно, могли бы реализовать что-то подобное.

============================================================

ОБНОВЛЕНИЕ: 12.01.2016

В версии 0.10.x ActiveModelSerializers attributes по умолчанию получает два аргумента. Я добавил *args, чтобы избежать исключения:

class GroupSerializer < ActiveModel::Serializer
  def attributes(*args)
    object.attributes.symbolize_keys
  end
end
person Kevin Jalbert    schedule 27.03.2015
comment
Как получить все атрибуты + еще несколько? key = object.attributes.symbolize_keys key[:one_more] = 'haha' нравится это? - person NamNamNam; 15.09.2018
comment
@NamNamNam это сработало для меня: def attribute(*_args) object.attributes.symbolize_keys.merge(one_more: 'ха-ха') end - person dbeachy1; 13.08.2019

Просто чтобы добавить к ответу @kevin. Я также искал, как добавить фильтры для возвращаемых атрибутов. Я просмотрел документацию active_model_serializers 0.9 и он поддерживает фильтры, которые выглядят следующим образом:

  def attributes
    object.attributes.symbolize_keys
  end
  def filter(keys)
          keys - [:author, :id]
  end

Я пробовал, но это не сработало. Я предположил, что это потому, что атрибуты не указаны явно. Мне пришлось сделать это так же, как указано в приведение рельсов для работы:

@@except=[:author, :id]
def attributes
    data = object.attributes.symbolize_keys
    @@except.each { |e| data.delete e  }
    data
end
person Salah Saleh    schedule 27.03.2015

Попробуйте следующее, чтобы получить все ключи атрибутов для класса Group:

Group.new.attributes.keys

Например, я получаю следующее для пользователей в одном приложении:

> User.new.attributes.keys
=> ["id", "password_digest", "auth_token", "password_reset_token", "password_reset_requested_at", "created_at", "updated_at"]
person Prakash Murthy    schedule 27.03.2015

В версии 0.10.x ActiveModelSerializers attributes по умолчанию получает два аргумента. Я добавил *args, чтобы избежать исключения:

class GroupSerializer < ActiveModel::Serializer
  def attributes(*args)
    object.attributes.symbolize_keys
  end
end
person adriancm    schedule 01.12.2016

Я хочу получить все атрибуты + еще несколько.

на основе ответа выше, эта работа:

class NotificationSerializer < ActiveModel::Serializer

def actor
  'asdasd'
end

def attributes(*args)
  keys = object.attributes
  keys[:actor] = actor()  # add attribute here
  keys.symbolize_keys
end

конец

person NamNamNam    schedule 15.09.2018