Module: Gutentag::ActiveRecord::InstanceMethods
- Defined in:
- lib/gutentag/active_record/instance_methods.rb,
lib/gutentag/active_record/instance_methods_3_2.rb,
lib/gutentag/active_record/instance_methods_4_2.rb
Overview
For Rails 4.2 only.
Constant Summary collapse
- AR_VERSION =
ActiveRecord::VERSION::STRING.to_f
Instance Method Summary collapse
-
#reset_tag_names ⇒ Object
The reason we overwrite the stored value is because new tags may be added to the instance directly (e.g. article.tags << tag), which invokes the save callbacks, but the old tag_names value is stored but not updated.
- #tag_names ⇒ Object
- #tag_names=(names) ⇒ Object
Instance Method Details
#reset_tag_names ⇒ Object
The reason we overwrite the stored value is because new tags may be added to the instance directly (e.g. article.tags << tag), which invokes the save callbacks, but the old tag_names value is stored but not updated.
13 14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/gutentag/active_record/instance_methods.rb', line 13 def reset_tag_names # Rails 5.1 introduces major changes to how ActiveModel::Dirty works: # https://github.com/pat/gutentag/pull/70#issuecomment-524605448 # For Rails <5.1 we'll use *_previously_changed? # and for 5.1+ we'll use saved_change_to_*? return if AR_VERSION < 5.1 && tag_names_previously_changed? return if AR_VERSION >= 5.1 && saved_change_to_tag_names? # Update the underlying value rather than going through the setter, to # ensure this update doesn't get marked as a 'change'. @attributes.write_from_database "tag_names", [] @prepared_tag_names = false end |
#tag_names ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/gutentag/active_record/instance_methods.rb', line 27 def tag_names if super.nil? || !prepared_tag_names? # If the underlying value is nil, we've not requested this from the # database yet. But we also don't want to make the query twice. So, grab # the names, prepare as needed, and make sure we also invoke the setter. names = .pluck(:name) prepare_tag_names(names) self.tag_names = names end # Use ActiveRecord's underlying implementation with change tracking. super end |
#tag_names=(names) ⇒ Object
42 43 44 45 46 47 48 |
# File 'lib/gutentag/active_record/instance_methods.rb', line 42 def tag_names=(names) # This value is about to be overwritten, but we want to make sure the change # tracking doesn't think the original value was nil. prepare_tag_names super Gutentag::TagNames.call(names) end |