我有三个模型"Input", "Mechanism"one_answers"Output"
机制'has_one':输入,'has_one':输出。
我想让它使机制对象具有name属性输入X对输出Y的影响
这是我尝试的:
class Mechanism
include Neo4j::ActiveNode
property :name, default: 'NewMechanism#{self.class.count}'
has_one :in, :input, class_name: 'Input'
has_one :out, :output, class_name: 'Output'
after_create :name_mechanism
def name_mechanism
self.update_attributes(name: "Effect of #{self.input.name} on #{self.output.name}")
end
end
但是当我在控制台中初始化一个对象时,我得到错误
NoMethodError: undefined method ' name' for nil:NilClass from app/models/mechanismrb: 12:在"name_mechanism"
所以是的,我使用Neo4j作为数据库,但我怀疑这不是Neo4j问题,而是我对Rails回调的弱理解。任何建议吗?
您的代码假设每个机制总是有关联的输入和输出。你需要迎合它不需要的情况。你可以这样写
class Mechanism
include Neo4j::ActiveNode
property :name, default: 'NewMechanism#{self.class.count}'
has_one :in, :input, class_name: 'Input'
has_one :out, :output, class_name: 'Output'
before_create :name_mechanism
def name_mechanism
if self.name.blank?
self.name = self.default_name
end
end
def default_name
"Effect of #{self.input ? self.input.name : "<input not set>"} on #{self.output ? self.output.name : "<output not set>"}"
end
end
注意,我已经将回调更改为before_create,因为这是设置默认名称的更好地方。还要注意的是,如果name_mechanism已经有了一个非空白的名字,那么name_mechanism会保留这个名字。
解决了。这假定在创建连接Input和Output对象的机制之前存在Input和Output对象。
class Mechanism
include Neo4j::ActiveNode
property :name, default: 'New Mechanism #{self.class.count}'
has_one :in, :input, class_name: 'Input'
has_one :out, :output, class_name: 'Output'
after_save :name_mechanism
def name_mechanism
unless (self.input.nil?) || (self.output.nil?)
self.name = "Effect of #{self.input.name} on #{self.output.name}"
end
end
end
关键要点:当使用Neo4j时,回调是在ActiveNode上的方法,而不是ActiveRecord。它们具有与ActiveRecord回调相同的名称和用法,但由于"对象生命周期"在Neo4j中可能有点不同,因此回调的典型用法可能并不总是适用。