Object
(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.
Generated with the Darkfish Rdoc Generator 1.1.6.