1

我有三个模型“输入”、“机制”和“输出”。

机制“has_one”:输入和“has_one”:输出。

我希望它使 Mechanism 对象具有名称属性“输入 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:nil 的未定义方法“名称”:来自 app/models/mechanism.rb:12 的 NilClass:in 'name_mechanism'

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

4

2 回答 2

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

于 2015-07-13T14:03:38.343 回答
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 中的“对象生命周期”可能有点不同,回调的典型用法可能并不总是适用。

于 2015-07-13T15:16:12.943 回答