Подтвердить что ты не робот

Непрерывные атрибуты модели ActiveRecord

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

4b9b3361

Ответ 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