提交 aae4f357 编写于 作者: J Jon Leighton

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.)
上级 6710f057
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册