Вы не можете действительно решить это. Вы можете аппроксимировать хак, но это не то, что когда-либо будет хорошо работать.
model.attribute_names
должен получить все ActiveRecord, но поля attr_accessor
не являются полями. Это обычные рубиновые методы, и единственный способ получить их - model.instance_methods
.
Идея 1
Вы можете сделать model.attribute_names + model.instance_methods
, но тогда вам придется отфильтровать все другие обычные рубиновые методы initialize, save
и т. Д., Что было бы непрактично.
Чтобы помочь отфильтровать instance_methods
, вы можете сопоставить их с model.instance_variables
(вам придется учитывать знак @
в переменных экземпляра вручную), но проблема в том, что переменные экземпляра не на самом деле существует вообще, пока не будет назначен.
Идея 2
В вашем environment.rb
, прежде чем загрузится что-либо еще , определите свой собственный self.attr_accessor
в ActiveRecord::Base
. Это может затем обернуть базовый attr_accessor
, но также сохранить имена атрибутов в личном списке. Тогда вы сможете выйти из этого списка позже. Тем не менее, я бы посоветовал против этого ... исправление основных языковых возможностей, таких как attr_accessor
, гарантированно принесет вам много боли.
Идея 3
Определите свой собственный custom_attr_accessor
в ActiveRecord::Base
, который делает то же самое, что и идея 2, и используйте его в своем коде, где вы хотите иметь возможность получать имена атрибутов. Это было бы безопасно, так как вы больше не будете загромождать встроенный метод attr_accessor
, но вам придется изменить весь код, чтобы использовать custom_attr_accessor
там, где это необходимо
В общем, я думаю, что вы пытаетесь сделать, что нужно знать обо всех полях attr_accessor
? Попробуйте взглянуть на свою проблему под другим углом, если можете.