card 1.17.1 → 1.17.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/config/initializers/recaptcha.rb +27 -19
  4. data/db/migrate/20160122153608_new_indeces.rb +10 -0
  5. data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +2 -2
  6. data/db/migrate_core_cards/20140317035504_account_requests_to_signups.rb +2 -2
  7. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +2 -2
  8. data/db/migrate_core_cards/20150807205221_create_references_for_search_cards.rb +4 -2
  9. data/db/schema.rb +5 -1
  10. data/db/version.txt +1 -1
  11. data/lib/card.rb +3 -3
  12. data/lib/card/reference.rb +68 -52
  13. data/mod/01_core/chunk/query_reference.rb +1 -1
  14. data/mod/01_core/set/all/collection.rb +1 -1
  15. data/mod/01_core/set/all/name.rb +27 -65
  16. data/mod/01_core/set/all/pattern.rb +6 -3
  17. data/mod/01_core/set/all/references.rb +135 -62
  18. data/mod/01_core/set/all/tracked_attributes.rb +1 -1
  19. data/mod/01_core/set/all/utils.rb +2 -2
  20. data/mod/01_core/spec/set/all/references_spec.rb +4 -3
  21. data/mod/01_core/spec/set/all/tracked_attributes_spec.rb +16 -22
  22. data/mod/01_history/lib/card/act.rb +32 -30
  23. data/mod/01_history/lib/card/change.rb +26 -18
  24. data/mod/01_history/set/all/history.rb +1 -1
  25. data/mod/04_settings/set/right/structure.rb +1 -1
  26. data/mod/05_email/set/all/notify.rb +1 -1
  27. data/mod/05_email/spec/set/right/followers_spec.rb +1 -1
  28. data/mod/05_standard/set/all/rich_html/editing.rb +42 -45
  29. data/mod/05_standard/set/type/list.rb +2 -2
  30. data/mod/05_standard/spec/set/self/all_spec.rb +3 -3
  31. data/mod/05_standard/spec/set/type/list_spec.rb +3 -3
  32. data/mod/05_standard/spec/set/type/listed_by_spec.rb +2 -2
  33. data/mod/05_standard/spec/set/type/search_type_spec.rb +1 -1
  34. data/spec/lib/card/reference_spec.rb +30 -28
  35. data/spec/models/card/trash_spec.rb +63 -63
  36. data/spec/models/card/type_transition_spec.rb +34 -35
  37. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4f48d47748a3722b990ce46cf124c029ab739c0
4
- data.tar.gz: e75894912cdeedb1503358bcf5debe5c85bb3019
3
+ metadata.gz: d772d98ac5c860f29c6c27e3e6d0a259f6c8e7a7
4
+ data.tar.gz: a7e78fc4a0d9c36fafd07efd6d90183df1b707aa
5
5
  SHA512:
6
- metadata.gz: d70cba85ffa764ea15973673238a89d8d19afcd50b2ec46d3eacf13e71ae617def616d83a044bf6150f1d636fd496c0061127cb708bbe87125957d676a12fcba
7
- data.tar.gz: 5b0d8f08cc4dfee2cf0e28ad804e9f61b6c3365041421be40b582506300177a6abf29845b61f834a76345b7a7cc943abdb0b84f9b0d26f47f5150b3e1c95e77e
6
+ metadata.gz: 136c7897642c4e96cd070a08d474f2b7b199175495dce04dbcdc65b5768b49fb8a897844117167c49e68a766117fc122afefb73b95c5c15adf01534241c03ce8
7
+ data.tar.gz: 1c1c8077a10fc53451bbfa5890367f6ee27a6e7a25a9461abdc1cffb002aef0c7e7ef85c59ae82a764f0fef28989a2fb7a2edf231a3b69ce4c723f01c16f3fd8
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.17.1
1
+ 1.17.2
@@ -1,24 +1,32 @@
1
1
  # -*- encoding : utf-8 -*-
2
- def load_config_from_card codename
3
- # the seed task runs initializers so we have to check
4
- # if the cards table is ready before we use it here
5
- return unless ActiveRecord::Base.connection.table_exists?('cards') &&
6
- Card.ancestors.include?(ActiveRecord::Base)
7
- ((ca = Card.find_by_codename codename) &&
8
- ca.raw_content.present? && ca.raw_content) ||
9
- Card::Auth::DEFAULT_RECAPTCHA_SETTINGS[codename] ||
10
- nil
2
+
3
+ # card config overrides application.rb config overrides default
4
+ def load_recaptcha_config setting
5
+ setting = "recaptcha_#{setting}".to_sym
6
+ Cardio.config.send("#{setting}=",
7
+ load_recaptcha_card_config(setting) || # card content
8
+ Cardio.config.send(setting) || # application.rb
9
+ Card::Auth::DEFAULT_RECAPTCHA_SETTINGS[setting])
10
+ end
11
+
12
+ def card_table_ready?
13
+ # FIXME: this test should be more generally usable
14
+ ActiveRecord::Base.connection.table_exists?('cards') &&
15
+ Card.ancestors.include?(ActiveRecord::Base)
16
+ end
17
+
18
+ # use if card with value is present
19
+ def load_recaptcha_card_config setting
20
+ card = Card.find_by_codename setting
21
+ card && card.db_content.present? && card.db_content
11
22
  end
12
23
 
13
24
  Recaptcha.configure do |config|
14
- Cardio.config.recaptcha_public_key ||=
15
- load_config_from_card(:recaptcha_public_key)
16
- Cardio.config.recaptcha_private_key ||=
17
- load_config_from_card(:recaptcha_private_key)
18
- Cardio.config.recaptcha_proxy ||=
19
- load_config_from_card(:recaptcha_proxy)
20
- config.public_key = Cardio.config.recaptcha_public_key
21
- config.private_key = Cardio.config.recaptcha_private_key
22
- # config.api_version = 'v1' if config.respond_to?(:api_version=)
23
- config.proxy = Cardio.config.recaptcha_proxy
25
+ # the seed task runs initializers so we have to check
26
+ # if the cards table is ready before we use it here
27
+ if card_table_ready?
28
+ [:public_key, :private_key, :proxy].each do |setting|
29
+ config.send "#{setting}=", load_recaptcha_config(setting)
30
+ end
31
+ end
24
32
  end
@@ -0,0 +1,10 @@
1
+ # add new indeces for datetime and ref_type fields
2
+ class NewIndeces < ActiveRecord::Migration
3
+ def change
4
+ add_index 'card_references', ['ref_type'],
5
+ name: 'card_references_ref_type_index' # using: :btree
6
+ add_index 'cards', ['created_at'], name: 'cards_created_at_index'
7
+ add_index 'cards', ['updated_at'], name: 'cards_updated_at_index'
8
+ add_index 'card_acts', ['acted_at'], name: 'acts_acted_at_index'
9
+ end
10
+ end
@@ -16,11 +16,11 @@ class RenamingForMenu < Card::CoreMigration
16
16
  renames.each do |oldname, newname|
17
17
  puts "updating: #{oldname}"
18
18
  c = Card[oldname]
19
- c.update_referencers = true
19
+ c.update_referers = true
20
20
  c.name = newname
21
21
  c.save!
22
22
  end
23
-
23
+
24
24
  codenames = %w{
25
25
  by_name
26
26
  by_update
@@ -17,7 +17,7 @@ class AccountRequestsToSignups < Card::CoreMigration
17
17
  # rename Account Request to "Sign up"
18
18
  new_signup = Card[:account_request]
19
19
  new_signup.name = newname
20
- new_signup.update_referencers = true
20
+ new_signup.update_referers = true
21
21
  new_signup.codename = :signup
22
22
  new_signup.save!
23
23
 
@@ -27,7 +27,7 @@ class AccountRequestsToSignups < Card::CoreMigration
27
27
  thanks = Card[:thanks]
28
28
  if (signup_thanks = Card["#{old_signup.name}+#{thanks.name}"])
29
29
  signup_thanks.name = "#{new_signup.name}+#{Card[:type].name}+#{thanks.name}"
30
- signup_thanks.update_referencers = true
30
+ signup_thanks.update_referers = true
31
31
  signup_thanks.save!
32
32
  end
33
33
 
@@ -5,7 +5,7 @@ class ImportBootstrapLayout < Card::CoreMigration
5
5
  layout = Card.fetch "Default Layout"
6
6
  if layout
7
7
  layout.name = "Classic Layout"
8
- layout.update_referencers = true
8
+ layout.update_referers = true
9
9
  layout.save!
10
10
  end
11
11
 
@@ -32,7 +32,7 @@ class ImportBootstrapLayout < Card::CoreMigration
32
32
  old_func = Card[:style_functional]
33
33
  old_func.name = 'style: cards'
34
34
  old_func.codename = 'style_cards'
35
- old_func.update_referencers = true
35
+ old_func.update_referers = true
36
36
  old_func.save!
37
37
 
38
38
  old_stand = Card[:style_standard]
@@ -2,8 +2,10 @@
2
2
 
3
3
  class CreateReferencesForSearchCards < Card::CoreMigration
4
4
  def up
5
- Card.where(type_id: Card::SearchTypeID).find_each.with_index do |card, index|
6
- card.update_references
5
+ Card.where(
6
+ type_id: Card::SearchTypeID
7
+ ).find_each.with_index do |card, index|
8
+ card.update_references_out
7
9
  puts "completed #{index} search cards" if index % 100 == 0
8
10
  end
9
11
  end
data/db/schema.rb CHANGED
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20151105225559) do
14
+ ActiveRecord::Schema.define(version: 20160122153608) do
15
15
 
16
16
  create_table "card_actions", force: :cascade do |t|
17
17
  t.integer "card_id", limit: 4
@@ -32,6 +32,7 @@ ActiveRecord::Schema.define(version: 20151105225559) do
32
32
  t.string "ip_address", limit: 255
33
33
  end
34
34
 
35
+ add_index "card_acts", ["acted_at"], name: "acts_acted_at_index", using: :btree
35
36
  add_index "card_acts", ["actor_id"], name: "card_acts_actor_id_index", using: :btree
36
37
  add_index "card_acts", ["card_id"], name: "card_acts_card_id_index", using: :btree
37
38
 
@@ -51,6 +52,7 @@ ActiveRecord::Schema.define(version: 20151105225559) do
51
52
  t.integer "present", limit: 4
52
53
  end
53
54
 
55
+ add_index "card_references", ["ref_type"], name: "card_references_ref_type_index", using: :btree
54
56
  add_index "card_references", ["referee_id"], name: "card_references_referee_id_index", using: :btree
55
57
  add_index "card_references", ["referee_key"], name: "card_references_referee_key_index", using: :btree
56
58
  add_index "card_references", ["referer_id"], name: "card_references_referer_id_index", using: :btree
@@ -84,12 +86,14 @@ ActiveRecord::Schema.define(version: 20151105225559) do
84
86
  t.text "db_content", limit: 16777215
85
87
  end
86
88
 
89
+ add_index "cards", ["created_at"], name: "cards_created_at_index", using: :btree
87
90
  add_index "cards", ["key"], name: "cards_key_index", unique: true, using: :btree
88
91
  add_index "cards", ["left_id"], name: "cards_left_id_index", using: :btree
89
92
  add_index "cards", ["name"], name: "cards_name_index", using: :btree
90
93
  add_index "cards", ["read_rule_id"], name: "cards_read_rule_id_index", using: :btree
91
94
  add_index "cards", ["right_id"], name: "cards_right_id_index", using: :btree
92
95
  add_index "cards", ["type_id"], name: "cards_type_id_index", using: :btree
96
+ add_index "cards", ["updated_at"], name: "cards_updated_at_index", using: :btree
93
97
 
94
98
  create_table "schema_migrations_core_cards", id: false, force: :cascade do |t|
95
99
  t.string "version", limit: 255, null: false
data/db/version.txt CHANGED
@@ -1 +1 @@
1
- 20151105225559
1
+ 20160122153608
data/lib/card.rb CHANGED
@@ -33,8 +33,8 @@ class Card < ActiveRecord::Base
33
33
  require_dependency 'card/subcards'
34
34
  require_dependency 'card/view_cache'
35
35
 
36
- has_many :references_from, class_name: :Reference, foreign_key: :referee_id
37
- has_many :references_to, class_name: :Reference, foreign_key: :referer_id
36
+ has_many :references_in, class_name: :Reference, foreign_key: :referee_id
37
+ has_many :references_out, class_name: :Reference, foreign_key: :referer_id
38
38
  has_many :acts, -> { order :id }
39
39
  has_many :actions, -> { where(draft: [nil, false]).order :id }
40
40
  has_many :drafts, -> { where(draft: true).order :id }, class_name: :Action
@@ -48,7 +48,7 @@ class Card < ActiveRecord::Base
48
48
  :action, :supercard, :superleft,
49
49
  :current_act, :current_action,
50
50
  :comment, :comment_author, # obviated soon
51
- :update_referencers, # wrong mechanism for this
51
+ :update_referers, # wrong mechanism for this
52
52
  :update_all_users, # if the above is wrong then this one too
53
53
  :silent_change, # and this probably too
54
54
  :remove_rule_stash,
@@ -1,68 +1,84 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
- class Card::Reference < ActiveRecord::Base
4
- def referencer
5
- Card[referer_id]
6
- end
7
-
8
- def referencee
9
- Card[referee_id]
10
- end
3
+ class Card
4
+ # a Reference is a directional relationship from one card (the referer)
5
+ # to another (the referee).
6
+ class Reference < ActiveRecord::Base
7
+ class << self
8
+ # bulk insert improves performance considerably
9
+ # array takes form [ [referer_id, referee_id, referee_key, ref_type], ...]
10
+ def mass_insert array
11
+ return if array.empty?
12
+ value_statements = array.map { |values| "\n(#{values.join ', '})" }
13
+ sql = 'INSERT into card_references '\
14
+ '(referer_id, referee_id, referee_key, ref_type) '\
15
+ "VALUES #{value_statements.join ', '}"
16
+ Card.connection.execute sql
17
+ end
11
18
 
12
- class << self
13
- def delete_all_from card
14
- delete_all referer_id: card.id
15
- end
19
+ # map existing reference to name to card via id
20
+ def map_referees referee_key, referee_id
21
+ where(referee_key: referee_key).update_all referee_id: referee_id
22
+ end
16
23
 
17
- def delete_all_to card
18
- where(referee_id: card.id).update_all present: 0, referee_id: nil
19
- end
24
+ # references no longer refer to card, so remove id
25
+ def unmap_referees referee_id
26
+ where(referee_id: referee_id).update_all referee_id: nil
27
+ end
20
28
 
21
- def update_existing_key card, name=nil
22
- key = (name || card.name).to_name.key
23
- where(referee_key: key).update_all present: 1, referee_id: card.id
24
- end
29
+ # find all references to missing (eg deleted) cards and reset them
30
+ def unmap_if_referee_missing
31
+ joins(
32
+ 'LEFT JOIN cards ON card_references.referee_id = cards.id'
33
+ ).where(
34
+ '(cards.id IS NULL OR cards.trash IS TRUE) AND referee_id IS NOT NULL'
35
+ ).update_all referee_id: nil
36
+ end
25
37
 
26
- def update_on_rename card, newname, update_referers=false
27
- if update_referers
28
- # not currently needed because references are deleted and re-created
29
- # in the process of adding new revision
30
- # where referee_id: card.id).update_all referee_key: newname.to_name.key
31
- else
32
- delete_all_to card
38
+ # remove all references from missing (eg deleted) cards
39
+ def delete_if_referer_missing
40
+ joins(
41
+ 'LEFT JOIN cards ON card_references.referer_id = cards.id'
42
+ ).where(
43
+ 'cards.id IS NULL'
44
+ ).find_in_batches do |group|
45
+ # used to be .delete_all here, but that was failing on large dbs
46
+ puts 'deleting batch of references'
47
+ where("id in (#{group.map(&:id).join ','})").delete_all
48
+ end
33
49
  end
34
- update_existing_key card, newname
35
- end
36
50
 
37
- def update_on_delete card
38
- delete_all_from card
39
- delete_all_to card
40
- end
51
+ # repair references one by one (delete, create, delete, create...)
52
+ # slower, but better than #repair_all for use on running sites
53
+ def repair_all
54
+ delete_if_referer_missing
55
+ Card.where(trash: false).find_each do |card|
56
+ Rails.logger.info "updating references from #{card}"
57
+ card.include_set_modules
58
+ card.update_references_out
59
+ end
60
+ end
41
61
 
42
- def repair_missing_referees
43
- joins(
44
- 'LEFT JOIN cards ON card_references.referee_id = cards.id'
45
- ).where(
46
- '(cards.id IS NULL OR cards.trash IS TRUE) AND referee_id IS NOT NULL'
47
- ).update_all referee_id: nil
62
+ # delete all references, then recreate them one by one
63
+ # faster than #repair_all, but not recommended for use on running sites
64
+ def recreate_all
65
+ delete_all
66
+ Card.where(trash: false).find_each do |card|
67
+ Rails.logger.info "updating references from #{card}"
68
+ card.include_set_modules
69
+ card.create_references_out
70
+ end
71
+ end
48
72
  end
49
73
 
50
- def delete_missing_referers
51
- joins(
52
- 'LEFT JOIN cards ON card_references.referer_id = cards.id'
53
- ).where(
54
- 'cards.id IS NULL'
55
- ).delete_all
74
+ # card that refers
75
+ def referer
76
+ Card[referer_id]
56
77
  end
57
78
 
58
- def repair_all
59
- delete_missing_referers
60
-
61
- Card.where(trash: false).find_each do |card|
62
- Rails.logger.info "Repairing references for '#{card.name}'" \
63
- "(id: #{card.id}) ... "
64
- card.update_references
65
- end
79
+ # card that is referred to
80
+ def referee
81
+ Card[referee_id]
66
82
  end
67
83
  end
68
84
  end
@@ -77,7 +77,7 @@ module Card::Chunk
77
77
  end
78
78
 
79
79
  def reference_code
80
- 'Q' # Q for "Query"
80
+ 'Q' # for "Query"
81
81
  end
82
82
  end
83
83
  end
@@ -26,7 +26,7 @@ module ClassMethods
26
26
  if block_given?
27
27
  super(options) do |records|
28
28
  yield(records)
29
- Card::Cache.reset_all
29
+ Card::Cache.reset_soft
30
30
  end
31
31
  else
32
32
  super(options)
@@ -10,7 +10,7 @@ module ClassMethods
10
10
  if rename == :old
11
11
  # name conflict resolved; original name can be used
12
12
  Card[name].update_attributes! name: uniq_name,
13
- update_referencers: true
13
+ update_referers: true
14
14
  name
15
15
  else
16
16
  uniq_name
@@ -71,39 +71,35 @@ def contextual_name
71
71
  end
72
72
 
73
73
  def relative_name context_name=nil
74
- if !context_name && @supercard
75
- context_name = @supercard.cardname
76
- end
77
- cardname.relative_name(context_name)
74
+ context_name ||= @supercard.cardname if @supercard
75
+ cardname.relative_name context_name
78
76
  end
79
77
 
80
78
  def absolute_name context_name=nil
81
- if !context_name && @supercard
82
- context_name = @supercard.cardname
83
- end
84
- cardname.absolute_name(context_name)
79
+ context_name ||= @supercard.cardname if @supercard
80
+ cardname.absolute_name context_name
85
81
  end
86
82
 
87
83
  def left *args
88
- return if simple?
89
- @superleft || begin
90
- unless name_changed? &&
91
- name.to_name.trunk_name.key == name_was.to_name.key
92
- # prevent recursion when, eg, renaming A+B to A+B+C
93
- Card.fetch cardname.left, *args
94
- end
84
+ case
85
+ when simple? then nil
86
+ when @superleft then @superleft
87
+ when name_changed? && name.to_name.trunk_name.key == name_was.to_name.key
88
+ nil # prevent recursion when, eg, renaming A+B to A+B+C
89
+ else
90
+ Card.fetch cardname.left, *args
95
91
  end
96
92
  end
97
93
 
98
94
  def right *args
99
- Card.fetch(cardname.right, *args) if !simple?
95
+ Card.fetch(cardname.right, *args) unless simple?
100
96
  end
101
97
 
102
98
  def [] *args
103
99
  case args[0]
104
100
  when Fixnum, Range
105
101
  fetch_name = Array.wrap(cardname.parts[args[0]]).compact.join '+'
106
- Card.fetch(fetch_name, args[1] || {}) if !simple?
102
+ Card.fetch(fetch_name, args[1] || {}) unless simple?
107
103
  else
108
104
  super
109
105
  end
@@ -141,22 +137,22 @@ def child_names parent_name=nil, side=nil
141
137
  "(#{side}) children of #{parent_name}")
142
138
  end
143
139
 
144
- def descendant_names parent_name=nil
140
+ # ids of children and children's children
141
+ def descendant_ids parent_id=nil
145
142
  return [] if new_card?
146
- parent_name ||= name
143
+ parent_id ||= id
147
144
  Auth.as_bot do
148
- deps = child_names parent_name
149
- deps.inject(deps) do |array, childname|
150
- array + descendant_names(childname)
151
- end
145
+ child_ids = Card.search part: parent_id, return: :id
146
+ child_descendant_ids = child_ids.map { |cid| descendant_ids cid }
147
+ (child_ids + child_descendant_ids).flatten.uniq
152
148
  end
153
149
  end
154
150
 
151
+ # children and children's children
152
+ # NOTE - set modules are not loaded
153
+ # -- should only be used for name manipulations
155
154
  def descendants
156
- # children and children's children
157
- # NOTE - set modules are not loaded
158
- # -- should only be used for name manipulations
159
- @descendants ||= descendant_names.map { |name| Card.quick_fetch name }
155
+ @descendants ||= descendant_ids.map { |id| Card.quick_fetch id }
160
156
  end
161
157
 
162
158
  def repair_key
@@ -208,7 +204,7 @@ event :validate_name, before: :approve, on: :save do
208
204
 
209
205
  unless cdname.valid?
210
206
  errors.add :name, 'may not contain any of the following characters: ' \
211
- "#{ Card::Name.banned_array * ' ' }"
207
+ "#{Card::Name.banned_array * ' '}"
212
208
  end
213
209
  # this is to protect against using a plus card as a tag
214
210
  if cdname.junction? && simple? && id &&
@@ -290,12 +286,6 @@ def suspend_name name
290
286
  end
291
287
 
292
288
  event :cascade_name_changes, after: :store, on: :update, changed: :name do
293
- # Rails.logger.info "------------------- #{name_was} CASCADE #{self.name} " \
294
- # " -------------------------------------"
295
- # handle strings from cgi
296
- self.update_referencers = false if update_referencers == 'false'
297
- Card::Reference.update_on_rename self, name, self.update_referencers
298
-
299
289
  des = descendants
300
290
  @descendants = nil # reset
301
291
 
@@ -306,36 +296,8 @@ event :cascade_name_changes, after: :store, on: :update, changed: :name do
306
296
  Card.expire de.name # old name
307
297
  newname = de.cardname.replace_part name_was, name
308
298
  Card.where(id: de.id).update_all name: newname.to_s, key: newname.key
309
- Card::Reference.update_on_rename de, newname, update_referencers
299
+ de.update_referers = update_referers
300
+ de.refresh_references_in
310
301
  Card.expire newname
311
302
  end
312
- execute_referencers_update(des) if update_referencers
313
- end
314
-
315
- def execute_referencers_update descendants
316
- Auth.as_bot do
317
- [name_referencers(name_was) + descendants.map(&:referencers)]
318
- .flatten.uniq.each do |card|
319
- # FIXME: using 'name_referencers' instead of plain 'referencers' for self
320
- # because there are cases where trunk and tag
321
- # have already been saved via association by this point and therefore
322
- # referencers misses things
323
- # eg. X includes Y, and Y is renamed to X+Z. When X+Z is saved, X is
324
- # first updated as a trunk before X+Z gets to this point.
325
- # so at this time X is still including Y, which does not exist.
326
- # therefore #referencers doesn't find it, but name_referencers(old_name)
327
- # does.
328
- # some even more complicated scenario probably breaks on the descendants,
329
- # so this probably needs a more thoughtful refactor
330
- # aligning the dependent saving with the name cascading
331
-
332
- Rails.logger.debug "------------------ UPDATE REFERER #{card.name} " \
333
- '------------------------'
334
- unless card == self || card.structure
335
- card = card.refresh
336
- card.db_content = card.replace_references name_was, name
337
- card.save!
338
- end
339
- end
340
- end
341
303
  end