class ActiveRecord::Associations::BelongsToPolymorphicAssociation
:nodoc:
def association_class
def association_class @owner[@reflection.options[:foreign_type]].present? ? @owner[@reflection.options[:foreign_type]].constantize : nil end
def conditions
def conditions @conditions ||= @reflection.options[:conditions] && interpolate_and_sanitize_sql(@reflection.options[:conditions], nil, association_class) end
def find_target
def find_target return nil if association_class.nil? target = if @reflection.options[:conditions] association_class.find( @owner[@reflection.primary_key_name], :select => @reflection.options[:select], :conditions => conditions, :include => @reflection.options[:include] ) else association_class.find(@owner[@reflection.primary_key_name], :select => @reflection.options[:select], :include => @reflection.options[:include]) end set_inverse_instance(target, @owner) target end
def foreign_key_present
def foreign_key_present !@owner[@reflection.primary_key_name].nil? end
def record_id(record)
def record_id(record) record.send(@reflection.options[:primary_key] || :id) end
def replace(record)
def replace(record) if record.nil? @target = @owner[@reflection.primary_key_name] = @owner[@reflection.options[:foreign_type]] = nil else @target = (AssociationProxy === record ? record.target : record) @owner[@reflection.primary_key_name] = record_id(record) @owner[@reflection.options[:foreign_type]] = record.class.base_class.name.to_s @updated = true end set_inverse_instance(record, @owner) loaded record end
def set_inverse_instance(record, instance)
def set_inverse_instance(record, instance) return if record.nil? || !we_can_set_the_inverse_on_this?(record) inverse_relationship = @reflection.polymorphic_inverse_of(record.class) unless inverse_relationship.nil? record.send(:"set_#{inverse_relationship.name}_target", instance) end end
def updated?
def updated? @updated end
def we_can_set_the_inverse_on_this?(record)
NOTE - for now, we're only supporting inverse setting from belongs_to back onto
def we_can_set_the_inverse_on_this?(record) if @reflection.has_inverse? inverse_association = @reflection.polymorphic_inverse_of(record.class) inverse_association && inverse_association.macro == :has_one else false end end