ruby-on-rails-3 metaprogramming jruby neo4j

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)