Parent

Files

Class Index [+]

Quicksearch

ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation

Public Instance Methods

association_join() click to toggle source

(Not documented)

     # File vendor/plugins/ubiquo_categories/lib/ubiquo_categories/extensions/active_record_through_conditions_fix.rb, line 6
  6:       def association_join
  7:         connection = reflection.active_record.connection
  8:         join = case reflection.macro
  9:           when :has_and_belongs_to_many
 10:             " #{join_type} %s ON %s.%s = %s.%s " % [
 11:                table_alias_for(options[:join_table], aliased_join_table_name),
 12:                connection.quote_table_name(aliased_join_table_name),
 13:                options[:foreign_key] || reflection.active_record.to_s.foreign_key,
 14:                connection.quote_table_name(parent.aliased_table_name),
 15:                reflection.active_record.primary_key] +
 16:             " #{join_type} %s ON %s.%s = %s.%s " % [
 17:                table_name_and_alias,
 18:                connection.quote_table_name(aliased_table_name),
 19:                klass.primary_key,
 20:                connection.quote_table_name(aliased_join_table_name),
 21:                options[:association_foreign_key] || klass.to_s.foreign_key
 22:                ]
 23:           when :has_many, :has_one
 24:             case
 25:               when reflection.options[:through]
 26:                 through_conditions = through_reflection.options[:conditions] ? " AND #{interpolate_sql(sanitize_sql(through_reflection.options[:conditions]))}" : ''
 27: 
 28:                 jt_foreign_key = jt_as_extra = jt_source_extra = jt_sti_extra = nil
 29:                 first_key = second_key = as_extra = nil
 30: 
 31:                 if through_reflection.options[:as] # has_many :through against a polymorphic join
 32:                   jt_foreign_key = through_reflection.options[:as].to_s + '_id'
 33:                   jt_as_extra = " AND %s.%s = %s" % [
 34:                     connection.quote_table_name(aliased_join_table_name),
 35:                     connection.quote_column_name(through_reflection.options[:as].to_s + '_type'),
 36:                     klass.quote_value(parent.active_record.base_class.name)
 37:                   ]
 38:                 else
 39:                   jt_foreign_key = through_reflection.primary_key_name
 40:                 end
 41: 
 42:                 case source_reflection.macro
 43:                 when :has_many
 44:                   if source_reflection.options[:as]
 45:                     first_key   = "#{source_reflection.options[:as]}_id"
 46:                     second_key  = options[:foreign_key] || primary_key
 47:                     as_extra    = " AND %s.%s = %s" % [
 48:                       connection.quote_table_name(aliased_table_name),
 49:                       connection.quote_column_name("#{source_reflection.options[:as]}_type"),
 50:                       klass.quote_value(source_reflection.active_record.base_class.name)
 51:                     ]
 52:                   else
 53:                     first_key   = through_reflection.klass.base_class.to_s.foreign_key
 54:                     second_key  = options[:foreign_key] || primary_key
 55:                   end
 56: 
 57:                   unless through_reflection.klass.descends_from_active_record?
 58:                     jt_sti_extra = " AND %s.%s = %s" % [
 59:                       connection.quote_table_name(aliased_join_table_name),
 60:                       connection.quote_column_name(through_reflection.active_record.inheritance_column),
 61:                       through_reflection.klass.quote_value(through_reflection.klass.sti_name)]
 62:                   end
 63:                 when :belongs_to
 64:                   first_key = primary_key
 65:                   if reflection.options[:source_type]
 66:                     second_key = source_reflection.association_foreign_key
 67:                     jt_source_extra = " AND %s.%s = %s" % [
 68:                       connection.quote_table_name(aliased_join_table_name),
 69:                       connection.quote_column_name(reflection.source_reflection.options[:foreign_type]),
 70:                       klass.quote_value(reflection.options[:source_type])
 71:                     ]
 72:                   else
 73:                     second_key = source_reflection.primary_key_name
 74:                   end
 75:                 end
 76: 
 77:                 " #{join_type} %s ON (%s.%s = %s.%s%s%s%s%s) " % [
 78:                   table_alias_for(through_reflection.klass.table_name, aliased_join_table_name),
 79:                   connection.quote_table_name(parent.aliased_table_name),
 80:                   connection.quote_column_name(parent.primary_key),
 81:                   connection.quote_table_name(aliased_join_table_name),
 82:                   connection.quote_column_name(jt_foreign_key),
 83:                   jt_as_extra, jt_source_extra, jt_sti_extra, through_conditions
 84:                 ] +
 85:                 " #{join_type} %s ON (%s.%s = %s.%s%s) " % [
 86:                   table_name_and_alias,
 87:                   connection.quote_table_name(aliased_table_name),
 88:                   connection.quote_column_name(first_key),
 89:                   connection.quote_table_name(aliased_join_table_name),
 90:                   connection.quote_column_name(second_key),
 91:                   as_extra
 92:                 ]
 93: 
 94:               when reflection.options[:as] && [:has_many, :has_one].include?(reflection.macro)
 95:                 " #{join_type} %s ON %s.%s = %s.%s AND %s.%s = %s" % [
 96:                   table_name_and_alias,
 97:                   connection.quote_table_name(aliased_table_name),
 98:                   "#{reflection.options[:as]}_id",
 99:                   connection.quote_table_name(parent.aliased_table_name),
100:                   parent.primary_key,
101:                   connection.quote_table_name(aliased_table_name),
102:                   "#{reflection.options[:as]}_type",
103:                   klass.quote_value(parent.active_record.base_class.name)
104:                 ]
105:               else
106:                 foreign_key = options[:foreign_key] || reflection.active_record.name.foreign_key
107:                 " #{join_type} %s ON %s.%s = %s.%s " % [
108:                   table_name_and_alias,
109:                   aliased_table_name,
110:                   foreign_key,
111:                   parent.aliased_table_name,
112:                   reflection.options[:primary_key] || parent.primary_key
113:                 ]
114:             end
115:           when :belongs_to
116:             " #{join_type} %s ON %s.%s = %s.%s " % [
117:                table_name_and_alias,
118:                connection.quote_table_name(aliased_table_name),
119:                reflection.options[:primary_key] || reflection.klass.primary_key,
120:                connection.quote_table_name(parent.aliased_table_name),
121:                options[:foreign_key] || reflection.primary_key_name
122:               ]
123:           else
124:             ""
125:         end || ''
126:         join << %(AND %s) % [
127:           klass.send(:type_condition, aliased_table_name)] unless klass.descends_from_active_record?
128: 
129:         [through_reflection, reflection].each do |ref|
130:           join << "AND #{interpolate_sql(sanitize_sql(ref.options[:conditions], aliased_table_name))} " if ref && ref.options[:conditions]
131:         end
132: 
133:         join
134:       end

Disabled; run with $DEBUG to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.