There are two ways to handle this, both easier than overriding the setter method.
The first is to use callbacks within your ActiveNode model.
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
I personally never use that process. I always use ActiveRel models for any relationship logic.
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
Then you'd create that:
rel = FantasticActiveWhatever.new(from_node: team, to_node: whatever)
if rel.save
# move on
end
ActiveRel requires some extra setup but it's so much more powerful.
Either way, this is something that needs to be wrapped in a transaction because the potential exists for you to remove the not_active
relationship but be unable to set the active
.
begin
tx = Neo4j::Transaction.new
# the whole process
rescue StandardError
tx.failure
# additional failure behavior, if any
ensure
tx.close
end
Basic relationship callbacks are documented at https://github.com/neo4jrb/neo4j/wiki/Neo4j-v3-Declared-Relationships#relationship-callbacks.
ActiveRel is documented at https://github.com/neo4jrb/neo4j/wiki/Neo4j%3A%3AActiveRel.
Transactions are documented at https://github.com/neo4jrb/neo4j/wiki/Transaction.