В 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
отфильтровывает унаследованные методы.