提交 d13f54d5 编写于 作者: R Ryuta Kamizono

Fix unscoping `default_scope` in STI associations

Since 5c71000d, it has lost to be able to unscope `default_scope` in STI
associations. This change will use `.empty_scope?` instead of
`.values.empty?` to regard as an empty scope if only have
`type_condition`.
上级 58c567ad
......@@ -219,8 +219,10 @@ def join_scopes(table, predicate_builder) # :nodoc:
end
def klass_join_scope(table, predicate_builder) # :nodoc:
if klass.current_scope && klass.current_scope.values.empty?
klass.unscoped
current_scope = klass.current_scope
if current_scope && current_scope.empty_scope?
build_scope(table, predicate_builder)
else
klass.default_scoped(build_scope(table, predicate_builder))
end
......
......@@ -642,6 +642,10 @@ def inspect
"#<#{self.class.name} [#{entries.join(', ')}]>"
end
def empty_scope? # :nodoc:
@values == klass.unscoped.values
end
protected
def load_records(records)
......
......@@ -392,6 +392,22 @@ def test_unscoped_with_joins_should_not_have_default_scope
Comment.joins(:post).to_a
end
def test_sti_association_with_unscoped_not_affected_by_default_scope
post = posts(:thinking)
comments = [comments(:does_it_hurt)]
post.special_comments.update_all(deleted_at: Time.now)
assert_raises(ActiveRecord::RecordNotFound) { Post.joins(:special_comments).find(post.id) }
assert_equal [], post.special_comments
SpecialComment.unscoped do
assert_equal post, Post.joins(:special_comments).find(post.id)
assert_equal comments, Post.joins(:special_comments).find(post.id).special_comments
assert_equal comments, Post.eager_load(:special_comments).find(post.id).special_comments
end
end
def test_default_scope_select_ignored_by_aggregations
assert_equal DeveloperWithSelect.all.to_a.count, DeveloperWithSelect.count
end
......
......@@ -54,6 +54,7 @@ def to_s
end
class SpecialComment < Comment
default_scope { where(deleted_at: nil) }
end
class SubSpecialComment < SpecialComment
......
......@@ -189,6 +189,7 @@
t.string :resource_id
t.string :resource_type
t.integer :developer_id
t.datetime :deleted_at
end
create_table :companies, force: true do |t|
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册