Rails заставляет методы модели появляться как атрибуты - PullRequest
1 голос
/ 07 января 2020

У меня есть модель подключения к Postgres дБ.

class Person < ApplicationRecord

  def say_id
    "#{name} has id: #{id}"
  end

end

У меня есть некоторые атрибуты id, name, email, а также метод выше: say_id, к которому можно получить доступ через:

person = Person.new
person.id => 1
person.say_id  => "John has id: 1"

Я бы хотел, чтобы метод 'say_id' также был указан в качестве атрибута, теперь при запуске person.attributes я вижу только: id, name, email

Как я могу мой метод включен в качестве информации для просмотра в полном объеме, как в файле person.attributes, но в который будет включен мой метод? Сценарий использования будет для ленивого размещения всех этих полей в таблице объекта Person.

1 Ответ

3 голосов
/ 07 января 2020

В Rails 5+ вы можете использовать атрибуты api для создания атрибутов, которые не поддерживаются столбцом базы данных:

class Person < ApplicationRecord
  attribute :foo
end
irb(main):002:0> Person.new.attributes
=> {"id"=>nil, "email"=>nil, "name"=>nil, "created_at"=>nil, "updated_at"=>nil, "foo"=>nil}

В отличие от того, что вы использовали attr_accessor на самом деле они ведут себя очень похоже на поддерживаемые базой данных атрибуты.

Затем вы можете переопределить метод getter, если хотите:

class Person < ApplicationRecord
  attribute :foo

  def foo
    "foo is #{super}"
  end
end
irb(main):005:0> Person.new(foo: 'bar').foo
=> "foo is bar"

Но что бы вы ни делали, его все равно нет правильный ответ. Вы можете получить список методов класса, вызвав .instance_methods для класса:

irb(main):007:0> Person.instance_methods(false)
=> [:foo]

Передача false отфильтровывает унаследованные методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...