我正在使用Neo4j在rails console
中玩游戏并试图创建一个这样的模型类:
Object.const_set("TestNode", Class.new(super_class=Neo4j::Rails::Model))
node = TestNode.new
如果我然后尝试使用node.save
保存实例,我会收到一堆错误:
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'
...
如果我像普通的那样创建TestNode类,那么一切都有效:
class TestNode < Neo4j::Rails::Model
end
创建模型类TestNode的第一种方法有什么问题?
我的目标是能够使用元编程动态创建新模型,然后能够将实例持久化到neo4j数据库。
答案 0 :(得分:3)
正如Andreas Ronge评论的那样,使用Object.const_set时不会触发一些回调。评估字符串是有效的,所以这是我的解决方案:
name ="Classname"
super_klass ="Neo4j::Rails::Model"
string_to_eval = "class #{name} < #{super_klass}; end;"
eval(string_to_eval, TOPLEVEL_BINDING)