mod/core/set/all/references.rb in card-1.95.3 vs mod/core/set/all/references.rb in card-1.96.0
- old
+ new
@@ -7,40 +7,46 @@
PARTIAL_REF_CODE = "P".freeze
# cards that refer to self
def referers
- references_in.map(&:referer_id).map(&Card.method(:fetch)).compact
+ referer_cards_from_references references_in
end
# cards that include self
-def includers
- refs = references_in.where(ref_type: "I")
- refs.map(&:referer_id).map(&Card.method(:fetch)).compact
+def nesters
+ referer_cards_from_references references_in.where(ref_type: "I")
end
+def referer_cards_from_references references
+ references.map(&:referer_id).uniq.map(&Card.method(:fetch)).compact
+end
+
# cards that self refers to
def referees
- references_out.map { |ref| Card.fetch ref.referee_key, new: {} }
+ referees_from_references references_out
end
# cards that self includes
-def includees
- refs = references_out.where(ref_type: "I")
- refs.map { |ref| Card.fetch ref.referee_key, new: {} }
+def nestees
+ referees_from_references references_out.where(ref_type: "I")
end
+def referees_from_references references
+ references.map(&:referee_key).uniq.map { |key| Card.fetch key, new: {} }
+end
+
# cards that refer to self by name
# (finds cards not yet linked by id)
def name_referers
Card.joins(:references_out).where card_references: { referee_key: key }
end
# cards that refer to self or any descendant
def family_referers
@family_referers ||= ([self] + descendants).map(&:referers).flatten.uniq
- # TODO: make this more efficient!
+ # TODO: make this more efficient using partial references!
end
# replace references in card content
def replace_reference_syntax old_name, new_name
obj_content = Card::Content.new content, self
@@ -155,26 +161,29 @@
end
# on rename, update names in cards that refer to self by name (as directed)
event :update_referer_content, :finalize,
on: :update, after: :name_change_finalized,
- when: proc { |card| card.update_referers } do
+ when: :update_referers do
# FIXME: break into correct stages
Auth.as_bot do
- family_referers.each do |card|
+ referers.each do |card|
next if card == self || card.structure
- card = card.refresh
- card.db_content = card.replace_reference_syntax name_before_last_save, name
- card.save!
+ new_content = card.replace_reference_syntax name_before_last_save, name
+ card.refresh.update_attributes! content: new_content
end
end
end
# on rename, when NOT updating referer content, update references to ensure
# that partial references are correctly tracked
# eg. A links to X+Y. if X+Y is renamed and we're not updating the link in A,
# then we need to be sure that A has a partial reference
event :update_referer_references_out, :finalize,
on: :update, after: :name_change_finalized,
- when: proc { |c| !c.update_referers } do
- family_referers.map(&:update_references_out)
+ when: :not_update_referers do
+ referers.map(&:update_references_out)
+end
+
+def not_update_referers
+ !update_referers
end