You can't really solve this. You can approximate a hack, but it's not something that will ever work nicely.
model.attribute_names
should get you all the ActiveRecord ones, but the attr_accessor
fields are not fields. They are just ordinary ruby methods, and the only way to get them is with model.instance_methods
.
Idea 1
You could do model.attribute_names + model.instance_methods
, but then you'd have to filter out all your other normal ruby methods initialize, save
, etc which would be impractical.
To help filter the instance_methods
you could match them up against model.instance_variables
(you'd have to account for the @
sign in the instance variables manually), but the problem with this is that instance variables don't actually exist at all until they are first assigned.
Idea 2
In your environment.rb
, before anything else ever gets loaded, define your own self.attr_accessor
in ActiveRecord::Base
. This could then wrap the underlying attr_accessor
but also save the attribute names to a private list. Then you'd be able to pull out of this list later on. However I'd advise against this... monkey-patching core language facilities like attr_accessor
is guaranteed to bring you a lot of pain.
Idea 3
Define your own custom_attr_accessor
in ActiveRecord::Base
, which does the same thing as Idea 2, and use it in your code where you want to be able to retrieve the attribute names. This would be safe as you won't be clobbering the built-in attr_accessor
method any more, but you'll have to change all your code to use custom_attr_accessor
where neccessary
I guess in summary, what are you trying to do that needs to know about all the attr_accessor
fields? Try look at your problem from a different angle if you can.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…