module Storext::Override::ClassMethods
Public Instance Methods
storext_override(association_name, column_name, override_options = {})
click to toggle source
# File lib/storext/override.rb, line 22 def storext_override(association_name, column_name, override_options = {}) self.override_options = { ignore_override_if_blank: false }.merge(override_options) origin_class = if override_options[:class] override_options[:class] else association = storext_overrider_find_association(association_name) association.class_name.constantize end storext_definitions = origin_class.storext_definitions storext_definitions.each do |attr, attr_definition| if attr_definition[:column] == column_name storext_overrider_accessor( association_name, column_name, attr, attr_definition ) end end end
Private Instance Methods
storext_overrider_accessor(association_name, column_name, attr, attr_definition)
click to toggle source
# File lib/storext/override.rb, line 56 def storext_overrider_accessor(association_name, column_name, attr, attr_definition) self.store_attribute( column_name, attr, attr_definition[:type], attr_definition[:opts].reject { |k,v| k == :default }, ) storext_overrider_define_override_control(column_name, attr) storext_overrider_define_reader(association_name, column_name, attr) storext_overrider_define_writer(column_name, attr) end
storext_overrider_define_override_control(column_name, attr)
click to toggle source
# File lib/storext/override.rb, line 95 def storext_overrider_define_override_control(column_name, attr) ivar = "@override_#{attr}" define_method :"override_#{attr}=" do |bool| if [0, '0', false].include?(bool) || storext_override_discard_value?(attr) destroy_key(column_name, attr) instance_variable_set(ivar, false) else instance_variable_set(ivar, true) end end define_method :"override_#{attr}" do value = instance_variable_get(ivar) if value.nil? storext_has_key?(column_name, attr) else value end end alias_method "override_#{attr}?", :"override_#{attr}" end
storext_overrider_define_reader(association_name, column_name, attr)
click to toggle source
# File lib/storext/override.rb, line 69 def storext_overrider_define_reader(association_name, column_name, attr) define_method :"#{attr}_with_parent_default" do |*args| if storext_has_key?(column_name, attr) send(:"#{attr}_without_parent_default", *args) else if association = send(association_name) association.send(attr) end end end alias_method :"#{attr}_without_parent_default", :"#{attr}" alias_method :"#{attr}", :"#{attr}_with_parent_default" end
storext_overrider_define_writer(column_name, attr)
click to toggle source
# File lib/storext/override.rb, line 83 def storext_overrider_define_writer(column_name, attr) define_method :"#{attr}_with_override_control=" do |*args| if instance_variable_get("@override_#{attr}") == false destroy_key(column_name, attr) else send(:"#{attr}_without_override_control=", *args) end end alias_method :"#{attr}_without_override_control=", :"#{attr}=" alias_method :"#{attr}=", :"#{attr}_with_override_control=" end
storext_overrider_find_association(name)
click to toggle source
# File lib/storext/override.rb, line 50 def storext_overrider_find_association(name) self.reflect_on_all_associations.find do |a| a.name == name end end