Created
June 3, 2009 14:25
-
-
Save bluescreen303/123007 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -urN aub-record_filter-0.9.6/lib/record_filter/conjunctions.rb aub-record_filter-0.9.6-force_alias/lib/record_filter/conjunctions.rb | |
--- aub-record_filter-0.9.6/lib/record_filter/conjunctions.rb 2009-06-03 15:47:44.000000000 +0200 | |
+++ aub-record_filter-0.9.6-force_alias/lib/record_filter/conjunctions.rb 2009-06-03 15:45:32.000000000 +0200 | |
@@ -19,7 +19,7 @@ | |
when DSL::Conjunction | |
result.add_conjunction(create_from(step, table)) | |
when DSL::Join | |
- join = result.add_join_on_association(step.association, step.join_type) | |
+ join = result.add_join_on_association(step.association, step.join_type, step.force_alias) | |
result.add_conjunction(create_from(step.conjunction, join.right_table)) | |
when DSL::ClassJoin | |
join = result.add_join_on_class( | |
@@ -57,13 +57,13 @@ | |
conjunction | |
end | |
- def add_join_on_association(association_name, join_type) | |
+ def add_join_on_association(association_name, join_type, force_alias) | |
table = @table | |
while association_name.is_a?(Hash) | |
table = table.join_association(association_name.keys[0], join_type).right_table | |
association_name = association_name.values[0] | |
end | |
- table.join_association(association_name, join_type) | |
+ table.join_association(association_name, join_type, {:force_alias => force_alias}) | |
end | |
def add_join_on_class(join_class, join_type, table_alias, conditions) | |
diff -urN aub-record_filter-0.9.6/lib/record_filter/dsl/conjunction_dsl.rb aub-record_filter-0.9.6-force_alias/lib/record_filter/dsl/conjunction_dsl.rb | |
--- aub-record_filter-0.9.6/lib/record_filter/dsl/conjunction_dsl.rb 2009-06-03 15:47:44.000000000 +0200 | |
+++ aub-record_filter-0.9.6-force_alias/lib/record_filter/dsl/conjunction_dsl.rb 2009-06-03 16:18:09.000000000 +0200 | |
@@ -193,11 +193,11 @@ | |
# be used as the association name. | |
# | |
# @public | |
- def having(join_type, association=nil, &block) | |
- if association.nil? | |
- association, join_type = join_type, nil | |
+ def having(join_type, association=nil, force_alias=nil, &block) | |
+ if [true, false, nil].include?(association) | |
+ force_alias, association, join_type = association, join_type, nil | |
end | |
- @conjunction.add_join(association, join_type, &block) | |
+ @conjunction.add_join(association, join_type, force_alias, &block) | |
end | |
# Create an explicit join on the table of the given class. This method allows more complex | |
diff -urN aub-record_filter-0.9.6/lib/record_filter/dsl/conjunction.rb aub-record_filter-0.9.6-force_alias/lib/record_filter/dsl/conjunction.rb | |
--- aub-record_filter-0.9.6/lib/record_filter/dsl/conjunction.rb 2009-06-03 15:47:44.000000000 +0200 | |
+++ aub-record_filter-0.9.6-force_alias/lib/record_filter/dsl/conjunction.rb 2009-06-03 15:44:24.000000000 +0200 | |
@@ -19,10 +19,10 @@ | |
@steps << dsl.conjunction | |
end | |
- def add_join(association, join_type, &block) | |
+ def add_join(association, join_type, force_alias, &block) | |
dsl = ConjunctionDSL.new(@model_class, Conjunction.new(@model_class, :all_of)) | |
dsl.instance_eval(&block) if block | |
- @steps << Join.new(association, join_type, dsl.conjunction) | |
+ @steps << Join.new(association, join_type, dsl.conjunction, force_alias) | |
dsl | |
end | |
diff -urN aub-record_filter-0.9.6/lib/record_filter/dsl/join.rb aub-record_filter-0.9.6-force_alias/lib/record_filter/dsl/join.rb | |
--- aub-record_filter-0.9.6/lib/record_filter/dsl/join.rb 2009-06-03 15:47:44.000000000 +0200 | |
+++ aub-record_filter-0.9.6-force_alias/lib/record_filter/dsl/join.rb 2009-06-03 15:45:01.000000000 +0200 | |
@@ -2,10 +2,10 @@ | |
module DSL | |
class Join # :nodoc: all | |
- attr_reader :association, :join_type, :conjunction | |
+ attr_reader :association, :join_type, :conjunction, :force_alias | |
- def initialize(association, join_type, conjunction) | |
- @association, @join_type, @conjunction = association, join_type, conjunction | |
+ def initialize(association, join_type, conjunction, force_alias) | |
+ @association, @join_type, @conjunction, @force_alias = association, join_type, conjunction, force_alias | |
end | |
end | |
end | |
diff -urN aub-record_filter-0.9.6/lib/record_filter/table.rb aub-record_filter-0.9.6-force_alias/lib/record_filter/table.rb | |
--- aub-record_filter-0.9.6/lib/record_filter/table.rb 2009-06-03 15:47:44.000000000 +0200 | |
+++ aub-record_filter-0.9.6-force_alias/lib/record_filter/table.rb 2009-06-03 15:39:32.000000000 +0200 | |
@@ -18,7 +18,9 @@ | |
def join_association(association_name, join_type=nil, options={}) | |
association_name = association_name.to_sym | |
- @joins_cache[association_name] ||= | |
+ cached = @joins_cache[association_name] | |
+ return cached if cached && !options[:force_alias] | |
+ new_join = | |
begin | |
association = @model_class.reflect_on_association(association_name) | |
if association.nil? | |
@@ -45,6 +47,8 @@ | |
end | |
end | |
end | |
+ @joins_cache[association_name] = new_join unless options[:force_alias] | |
+ new_join | |
end | |
def join_class(clazz, join_type, table_alias, conditions) | |
@@ -101,7 +105,7 @@ | |
clazz = options[:join_class].nil? ? association.klass : options[:join_class].constantize | |
- join_table = Table.new(clazz, alias_for_association(association)) | |
+ join_table = Table.new(clazz, alias_for_association(association, options[:force_alias])) | |
@joins << join = Join.new(self, join_table, join_predicate, join_type) | |
join | |
end | |
@@ -131,10 +135,12 @@ | |
protected | |
- def alias_for_association(association) | |
- @alias_cache ||= {} | |
- @alias_cache[association.name] ||= | |
- "#{@aliased ? @table_alias.to_s : @model_class.table_name}__#{association.name.to_s.underscore}" | |
+ def alias_for_association(association, force_alias = false) | |
+ @alias_cache ||= {} | |
+ aname = association.name.to_s.underscore | |
+ aname << "_#{@alias_cache.length + 1}" if force_alias | |
+ @alias_cache[aname] ||= | |
+ "#{@aliased ? @table_alias.to_s : @model_class.table_name}__#{aname}" | |
end | |
alias_method :alias_for_class, :alias_for_association |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment