I have the name of a class and I want to create an instance of that class so that I can loop through each rails attribute that is present in the schema of that class.开发者_如何学运维
How would I go about doing that?
- I have the name as a string of the class I want to check
- I guess I need to instantiate a class instance so that I can
- Loop through it's attributes and print them.
In rails you can just do:
clazz = 'ExampleClass'.constantize
In pure ruby:
clazz = Object.const_get('ExampleClass')
with modules:
module Foo
class Bar
end
end
you would use
> clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c}
=> Foo::Bar
> clazz.new
=> #<Foo::Bar:0x0000010110a4f8>
Very simple in Rails: use String#constantize
class_name = "MyClass"
instance = class_name.constantize.new
Try this:
Kernel.const_get("MyClass").new
Then to loop through an object's instance variables:
obj.instance_variables.each do |v|
# do something
end
module One
module Two
class Three
def say_hi
puts "say hi"
end
end
end
end
one = Object.const_get "One"
puts one.class # => Module
three = One::Two.const_get "Three"
puts three.class # => Class
three.new.say_hi # => "say hi"
In ruby 2.0 and, possibly earlier releases, Object.const_get
will recursively perform a lookup on a namespaces like Foo::Bar
. The example above is when the namespace is known ahead of time and highlights the fact that const_get
can be called on modules directly as opposed to exclusively on Object
.
精彩评论