【问题标题】:Automatic naming of objects based on associations with other models基于与其他模型的关联自动命名对象
【发布时间】:2015-07-13 13:41:09
【问题描述】:

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

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

我希望它使 Mechanism 对象具有 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/mechanism.rb:12:in 'name_mechanism'

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 neo4j neo4j.rb


    【解决方案1】:

    您的代码假设每个机制都将始终具有关联的输入和输出。你需要迎合它没有的情况。你可以这样做

    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 中可能有点不同,回调的典型用法可能并不总是适用。

      【讨论】:

      • 我认为 Max 的因式分解值得一看,但我也对潜在问题感到好奇。您的创建/保存语句是什么样的?例如,如果您正在创建并指定当时的输入和输出,那么可能有一个论点是在所有关系创建之后发生after_save。我认为值得在neo4j repo 中添加一个问题:github.com/neo4jrb/neo4j/issues/new
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多