2015-07-13 3 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, так как это лучшее место, чтобы установить имя по умолчанию. Также обратите внимание, что имя_механизм сохраняет имя, если оно уже имеет непустую.

2

Решено. Это предполагает, что объекты ввода и вывода существуют до создания Механизма, который связывает эти два.

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

Я думаю, что факторинг Макса стоит посмотреть, но мне также интересно узнать о проблеме. Как выглядят ваши заявления о создании/сохранении? Если вы создаете, например, и указываете вход и выход в то время, то, возможно, есть аргумент о том, что после того, как все создания отношений произойдут, «after_save». Я думаю, что стоит добавить вопрос в репозиторий 'neo4j': github.com/neo4jrb/neo4j/issues/new –

Смежные вопросы