ruby on rails—根据与其他模型的关联自动命名对象



我有三个模型"Input", "Mechanism"one_answers"Output"

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

我想让它使机制对象具有name属性输入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/mechanismrb: 12:在"name_mechanism"

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

您的代码假设每个机制总是有关联的输入和输出。你需要迎合它不需要的情况。你可以这样写

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已经有了一个非空白的名字,那么name_mechanism会保留这个名字。

解决了。这假定在创建连接Input和Output对象的机制之前存在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中可能有点不同,因此回调的典型用法可能并不总是适用。

相关内容

  • 没有找到相关文章

最新更新