Permalink
Browse files

Nullify the relation at a more general level.

This allows us to avoid hacks like the "return 0 if owner.new_record?"
in #count (which this commit removes).

Also, the relevant foreign key may actually be present even on a new
owner record, in which case we *don't* want a null relation. This logic
is encapsulated in the #null_scope? method.

We also need to make sure that the CollectionProxy is not 'infected'
with the NullRelation module, or else the methods from there will
override the definitions in CollectionProxy, leading to incorrect
results. Hence the nullify: false option to CollectionAssociation#scope.
(This feels a bit nasty but I can't think of a better way.)
  • Loading branch information...
1 parent 6710f05 commit aae4f357b5dae389b91129258f9d6d3043e7631e @jonleighton jonleighton committed Nov 9, 2012
@@ -174,8 +174,6 @@ def sum(*args)
# association, it will be used for the query. Otherwise, construct options and pass them with
# scope to the target class's +count+.
def count(column_name = nil, count_options = {})
- return 0 if owner.new_record?
-
column_name, count_options = nil, column_name if column_name.is_a?(Hash)
if options[:counter_sql] || options[:finder_sql]
@@ -366,6 +364,16 @@ def add_to_target(record)
record
end
+ def scope(opts = {})
+ scope = super()
+ scope.none! if opts.fetch(:nullify, true) && null_scope?
+ scope
+ end
+
+ def null_scope?
+ owner.new_record? && !foreign_key_present?
+ end
+
private
def custom_counter_sql
@@ -31,7 +31,7 @@ class CollectionProxy < Relation
def initialize(association) #:nodoc:
@association = association
super association.klass, association.klass.arel_table
- merge! association.scope
+ merge! association.scope(nullify: false)
end
def target
@@ -835,9 +835,8 @@ def scoping
# Returns a <tt>Relation</tt> object for the records in this association
def scope
association = @association
- scope = @association.scope
- scope.none! if @association.owner.new_record?
- scope.extending! do
+
+ @association.scope.extending! do
define_method(:proxy_association) { association }
end
end
@@ -46,7 +46,7 @@ def where_values_hash
{}
end
- def count
+ def count(*)
0
end

0 comments on commit aae4f35

Please sign in to comment.