2015-12-13 2 views
1

Я хочу, чтобы JSON возвращал для каждой модели атрибут таблицы, указывающий таблицу базы данных, из которой происходит объект (с STI это не то же самое, что и класс модели) и найти соответствующую фабричную функцию для создания объектов.Использование ActiveModel :: Serializer Как добавить атрибут таблицы для каждой модели

Я полагаю, что я мог бы вручную переопределить атрибут таблицы для каждого сериализатора, но это кажется действительно уродливым. Есть ли способ сделать это вообще?

ответ

0

Хорошее решение будет охватывать 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, хотя я думаю, что каждой модели понадобится сериализатор, в отличие от моего решения.

+0

Просто крошечное придираться. Я считаю, что это добавляет имя класса, а не таблицу. Это легко изменить, я просто почувствовал, что должен указать на это. Более тревожно это замалчивает любое использование вызова атрибутов в моих моделях. Суть создания сериализатора состоит в том, чтобы отделить логику модели и проблемы сериализации. –

+0

Это было очень полезно для моей будущей работы. Благодаря! –

2

Это работает.

все мои сериализаторов наследуют из следующих функций:

class ApplicationSerializer < ActiveModel::Serializer 

    attributes :table_name 

    def table_name 
     object.class.table_name 
    end 
end