aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/active_relation/primitives/attribute.rb8
-rw-r--r--lib/active_relation/relations/join.rb22
2 files changed, 27 insertions, 3 deletions
diff --git a/lib/active_relation/primitives/attribute.rb b/lib/active_relation/primitives/attribute.rb
index d815656794..d37271490a 100644
--- a/lib/active_relation/primitives/attribute.rb
+++ b/lib/active_relation/primitives/attribute.rb
@@ -54,6 +54,14 @@ module ActiveRelation
def =~(other)
!(history & other.history).empty?
end
+
+ def %(other)
+ if other
+ (history - other.history) + (other.history - history)
+ else
+ history
+ end
+ end
end
include Congruence
diff --git a/lib/active_relation/relations/join.rb b/lib/active_relation/relations/join.rb
index dbcb520b92..a3e45f7f81 100644
--- a/lib/active_relation/relations/join.rb
+++ b/lib/active_relation/relations/join.rb
@@ -24,8 +24,17 @@ module ActiveRelation
end
def prefix_for(attribute)
- externalize(relation1).prefix_for(attribute) or
- externalize(relation2).prefix_for(attribute)
+ if relation1[attribute] && !relation2[attribute]
+ externalize(relation1).prefix_for(attribute)
+ elsif relation2[attribute] && !relation1[attribute]
+ externalize(relation2).prefix_for(attribute)
+ else
+ if (attribute % relation1[attribute]).size < (attribute % relation2[attribute]).size
+ externalize(relation1).prefix_for(attribute)
+ else
+ externalize(relation2).prefix_for(attribute)
+ end
+ end
end
def joins
@@ -55,7 +64,14 @@ module ActiveRelation
delegate :engine, :to => :relation
def table_sql
- relation.aggregation?? relation.to_sql(Sql::TableReference.new(engine)) : relation.table_sql
+ case
+ when relation.aggregation?
+ relation.to_sql(Sql::TableReference.new(engine))
+ when relation.alias?
+ relation.table_sql + ' AS ' + engine.quote_table_name(relation.alias.to_s)
+ else
+ relation.table_sql
+ end
end
def selects