2015-07-13 57 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 –

相關問題