【问题标题】:Creating rails model with Object.const_set使用 Object.const_set 创建 rails 模型
【发布时间】:2012-10-07 01:41:23
【问题描述】:

我在rails console 中使用 Neo4j 并试图创建一个这样的模型类:

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 数据库。

【问题讨论】:

  • 我猜在使用 Class.new 方法时没有触发、继承、扩展和包含其中一个 ruby​​ 回调。也许对字符串做一个 eval 。

标签: ruby-on-rails-3 metaprogramming jruby neo4j


【解决方案1】:

正如 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多