1

我正在尝试覆盖一个已声明关系的 setter 方法,以在旧节点和新节点上执行自定义行为和一些验证。

例如,举下一个例子:

class FantasticTeam 
  include Neo4j::ActiveNode

  has_one :in, :active, model_class: Whatever
  has_many :in, :not_active, model_class: Whatever

  def active=(whatever)
    # return if whatever is not include in :not_active
    # add the old value to :not_active
    # delete the relationship :not_active that belongs to whatever (the param)
    # add :active relationship to whatever
  end
end

做这样的事情的正确方法是什么?

4

1 回答 1

3

有两种方法可以处理这个问题,都比重写 setter 方法更容易。

第一种是在 ActiveNode 模型中使用回调。

class FantasticTeam 
  include Neo4j::ActiveNode

  has_one :in, :active, before: :before_callback, model_class: Whatever
  has_many :in, :not_active, model_class: Whatever

  private

  def before_callback(other)
    return false unless self.not_active.include?(other)
    self.not_active(:w, :r).where(uuid: other.uuid).pluck(:r).each { |r| r.destroy }
    self.not_active << other unless self.active.nil?
  end
end

我个人从不使用这个过程。我总是将 ActiveRel 模型用于任何关系逻辑。

class FantasticTeam 
  include Neo4j::ActiveNode

  has_one :in, :active, model_class: 'Whatever', rel_class: 'FantasticActiveWhatever'
  has_many :in, :not_active, model_class: 'Whatever'

end

class FantasticActiveWhatever
  include Neo4j::ActiveRel
  from_class FantasticTeam
  to_class Whatever
  type 'ACTIVE'

  validate      :inactive
  before_create :clear_inactive

  private

  def inactive
    self.errors.add(:inactive, 'Destination node must be declared inactive') unless from_node.not_active.include?(to_node)
  end

  def clear_inactive
    from_node.not_active(:w, :r).where(uuid: to_node.uuid).pluck(:r).each { |r| r.destroy }
  end
end

然后你会创建:

rel = FantasticActiveWhatever.new(from_node: team, to_node: 不管) if rel.save # 继续前进

ActiveRel 需要一些额外的设置,但它的功能要强大得多。

无论哪种方式,这都需要包含在事务中,因为您可能会删除not_active关系但无法设置active.

begin
  tx = Neo4j::Transaction.new
  # the whole process
rescue StandardError
  tx.failure
  # additional failure behavior, if any
ensure
  tx.close
end

基本关系回调记录在https://github.com/neo4jrb/neo4j/wiki/Neo4j-v3-Declared-Relationships#relationship-callbacks

ActiveRel 记录在https://github.com/neo4jrb/neo4j/wiki/Neo4j%3A%3AActiveRel

交易记录在https://github.com/neo4jrb/neo4j/wiki/Transaction

于 2014-10-18T14:33:51.437 回答