ruby on rails 3 - Crear un modelo de rieles con Object.const_set
ruby-on-rails-3 metaprogramming (1)
Estoy jugando en la rails console
con Neo4j y traté de crear una clase de modelo como esta:
Object.const_set("TestNode", Class.new(super_class=Neo4j::Rails::Model))
node = TestNode.new
si intento guardar la instancia con node.save
, recibo un montón de errores:
node.save
NoMethodError: undefined method `each'' for nil:NilClass
from /Users/oskbor/.rvm/gems/jruby-1.6.7.2/gems/neo4j-2.0.0-java/lib/neo4j/rails/attributes.rb:57:in `init_on_create''
from /Users/oskbor/.rvm/gems/jruby-1.6.7.2/gems/neo4j-2.0.0-java/lib/neo4j/rails/node_persistance.rb:16:in `create''
from /Users/oskbor/.rvm/gems/jruby-1.6.7.2/gems/neo4j-2.0.0-java/lib/neo4j/rails/callbacks.rb:39:in `create_with_callbacks''
from /Users/oskbor/.rvm/gems/jruby-1.6.7.2/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:417:in `_run__1980184148__create__1722973119__callbacks''
from org/jruby/RubyKernel.java:2076:in `send''
...
Todo funciona si creo la clase TestNode como normal:
class TestNode < Neo4j::Rails::Model
end
¿Qué problema hay con la primera forma de crear la clase de modelo TestNode?
El objetivo que tengo en mente es poder crear nuevos modelos sobre la marcha usando metaprogramación y luego poder persistir instancias a la base de datos neo4j.
Como comentó Andreas Ronge, algunas devoluciones de llamadas no se activan cuando se usa Object.const_set. La evaluación de una cadena funciona, así que esta fue mi solución:
name ="Classname"
super_klass ="Neo4j::Rails::Model"
string_to_eval = "class #{name} < #{super_klass}; end;"
eval(string_to_eval, TOPLEVEL_BINDING)