1

「入力」「機構」「出力」の3つのモデルがあります。

メカニズム「has_one」:入力および「has_one」:出力。

Mechanismオブジェクトが「出力Yに対する入力Xの影響」という名前属性を持つようにしたい。

これが私が試したものです:

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: app/models/mechanism.rb:12:in 'name_mechanism' からの nil:NilClass の未定義のメソッド 'name'

ええ、私は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

解決しました。これは、入力オブジェクトと出力オブジェクトが、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 を使用する場合、コールバックは ActiveRecord ではなく ActiveNode のメソッドです。それらは ActiveRecord コールバックと同じ名前と使用法を持っていますが、Neo4j では「オブジェクトのライフサイクル」が少し異なる可能性があるため、コールバックの一般的な使用法が常に適用されるとは限りません。

于 2015-07-13T15:16:12.943 に答える