Я хочу добавить к существующей модели некоторые атрибуты, которые не нужно сохранять или даже сопоставлять с столбцом базы данных. Есть ли решение указать такую вещь?
Непрерывные атрибуты модели ActiveRecord
Ответ 1
Конечно, используйте старый добрый рубин attr_accessor
. В вашей модели:
attr_accessor :foo, :bar
Вы сможете:
object.foo = 'baz'
object.foo #=> 'baz'
Ответ 2
У меня была такая же проблема, но мне нужно было загрузить модель, поэтому атрибут должен был сохраняться после вызова to_json. Для этого вам нужно сделать еще одну вещь.
Как указано apneadiving, самый простой способ начать - это перейти к вашей модели и добавить:
attr_accessor :foo
Затем вы можете назначить нужные вам атрибуты. Но для создания атрибута вам нужно изменить метод атрибутов. В вашем файле модели добавьте этот метод:
def attributes
super.merge('foo' => self.foo)
end
Ответ 3
Если кому-то интересно, как это сделать для представления, используйте аргументы метода для метода render, например:
render json: {results: results}, methods: [:my_attribute]
Пожалуйста, знайте, что это работает только если вы установите attr_accessor в своей модели и установите атрибут в действии контроллера, как объяснил выбранный ответ.
Ответ 4
В моем случае я хотел использовать левое соединение для заполнения пользовательского атрибута. Он работает, если я ничего не добавляю, но я также хочу иметь возможность устанавливать атрибут на новый объект, и, конечно, его не существует. Если я добавлю attr_accessor
, тогда он всегда возвращает nil
после select
. Здесь подход, который я закончил, работает для установки на новый объект и получения из левого соединения.
after_initialize do
self.foo = nil unless @attributes.key?("foo")
end
def foo
@attributes["foo"]
end
def foo=(value)
@attributes["foo"] = value
end