4

私はrails consoleNeo4jで遊んでいて、次のようなモデルクラスを作成しようとしました:

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 データベースに永続化できるようにすることです。

4

1 に答える 1

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)
于 2012-10-06T17:41:23.270 に答える