2015-07-13 50 views
1

我有三个模型“输入”,“机制”和“输出”。基于与其他模型的关联自动命名对象

机制'has_one':输入和'has_one':输出。

我希望它使机制对象具有名称属性 “输入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/mechanism.rb:12:in 'name_mechanism'

所以,是的,我使用的Neo4j作为一个数据库,但我怀疑这不是neo4j问题,而是我对Rails回调的理解不足。有什么建议?

回答

2

你的代码假设每个机制总是有相关的输入和输出。你需要迎合它没有的情况。你可以做这样的事情

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已经有一个非空白的名字,它将保留该名称。

2

解决了它。这假定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中的“对象生命周期”可能有点不同,回调的典型用法可能并不总是适用。

+1

我认为Max的保理是值得关注的,但我也对底层问题感到好奇。你的创建/保存语句是什么样的?例如,如果你正在创建,并指定当时的输入和输出,那么在所有关系创建之后都有'after_save'发生的争论。我认为可能值得在'neo4j'回购中增加一个问题:github.com/neo4jrb/neo4j/issues/new –