Skip to content

Instantly share code, notes, and snippets.

@bluescreen303
Created June 3, 2009 14:25
Show Gist options
  • Save bluescreen303/123007 to your computer and use it in GitHub Desktop.
Save bluescreen303/123007 to your computer and use it in GitHub Desktop.
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