Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
4aa6559b
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
4aa6559b
编写于
8月 17, 2020
作者:
R
Ryuta Kamizono
提交者:
GitHub
8月 17, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #40056 from kamipo/fix_preloader_associate_by_default
Fix preloader to associate preloaded records by default
上级
d72ade10
f80179db
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
30 addition
and
14 deletion
+30
-14
activerecord/lib/active_record/associations/preloader.rb
activerecord/lib/active_record/associations/preloader.rb
+6
-2
activerecord/lib/active_record/associations/preloader/association.rb
...d/lib/active_record/associations/preloader/association.rb
+8
-11
activerecord/lib/active_record/associations/preloader/through_association.rb
...tive_record/associations/preloader/through_association.rb
+1
-1
activerecord/test/cases/associations_test.rb
activerecord/test/cases/associations_test.rb
+15
-0
未找到文件。
activerecord/lib/active_record/associations/preloader.rb
浏览文件 @
4aa6559b
...
...
@@ -96,6 +96,10 @@ def preload(records, associations, preload_scope = nil)
end
end
def
initialize
(
associate_by_default:
true
)
@associate_by_default
=
associate_by_default
end
private
# Loads all the given data into +records+ for the +association+.
def
preloaders_on
(
association
,
records
,
scope
,
polymorphic_parent
=
false
)
...
...
@@ -144,7 +148,7 @@ def preloaders_for_one(association, records, scope, polymorphic_parent)
def
preloaders_for_reflection
(
reflection
,
records
,
scope
)
records
.
group_by
{
|
record
|
record
.
association
(
reflection
.
name
).
klass
}.
map
do
|
rhs_klass
,
rs
|
preloader_for
(
reflection
,
rs
).
new
(
rhs_klass
,
rs
,
reflection
,
scope
).
run
preloader_for
(
reflection
,
rs
).
new
(
rhs_klass
,
rs
,
reflection
,
scope
,
@associate_by_default
).
run
end
end
...
...
@@ -159,7 +163,7 @@ def grouped_records(association, records, polymorphic_parent)
end
class
AlreadyLoaded
# :nodoc:
def
initialize
(
klass
,
owners
,
reflection
,
preload_scope
)
def
initialize
(
klass
,
owners
,
reflection
,
preload_scope
,
associate_by_default
=
true
)
@owners
=
owners
@reflection
=
reflection
end
...
...
activerecord/lib/active_record/associations/preloader/association.rb
浏览文件 @
4aa6559b
...
...
@@ -4,25 +4,22 @@ module ActiveRecord
module
Associations
class
Preloader
class
Association
#:nodoc:
def
initialize
(
klass
,
owners
,
reflection
,
preload_scope
)
def
initialize
(
klass
,
owners
,
reflection
,
preload_scope
,
associate_by_default
=
true
)
@klass
=
klass
@owners
=
owners
.
uniq
(
&
:__id__
)
@reflection
=
reflection
@preload_scope
=
preload_scope
@associate
=
associate_by_default
||
!
preload_scope
||
preload_scope
.
empty_scope?
@model
=
owners
.
first
&&
owners
.
first
.
class
end
def
run
if
!
preload_scope
||
preload_scope
.
empty_scope?
owners
.
each
do
|
owner
|
associate_records_to_owner
(
owner
,
records_by_owner
[
owner
]
||
[])
end
else
# Custom preload scope is used and
# the association cannot be marked as loaded
# Loading into a Hash instead
records_by_owner
end
records
=
records_by_owner
owners
.
each
do
|
owner
|
associate_records_to_owner
(
owner
,
records
[
owner
]
||
[])
end
if
@associate
self
end
...
...
activerecord/lib/active_record/associations/preloader/through_association.rb
浏览文件 @
4aa6559b
...
...
@@ -4,7 +4,7 @@ module ActiveRecord
module
Associations
class
Preloader
class
ThroughAssociation
<
Association
# :nodoc:
PRELOADER
=
ActiveRecord
::
Associations
::
Preloader
.
new
PRELOADER
=
ActiveRecord
::
Associations
::
Preloader
.
new
(
associate_by_default:
false
)
def
initialize
(
*
)
super
...
...
activerecord/test/cases/associations_test.rb
浏览文件 @
4aa6559b
...
...
@@ -354,8 +354,23 @@ def test_requires_symbol_argument
end
end
class
PreloaderTest
<
ActiveRecord
::
TestCase
fixtures
:posts
,
:comments
def
test_preload_with_scope
post
=
posts
(
:welcome
)
preloader
=
ActiveRecord
::
Associations
::
Preloader
.
new
preloader
.
preload
([
post
],
:comments
,
Comment
.
where
(
body:
"Thank you for the welcome"
))
assert_predicate
post
.
comments
,
:loaded?
assert_equal
[
comments
(
:greetings
)],
post
.
comments
end
end
class
GeneratedMethodsTest
<
ActiveRecord
::
TestCase
fixtures
:developers
,
:computers
,
:posts
,
:comments
def
test_association_methods_override_attribute_methods_of_same_name
assert_equal
(
developers
(
:david
),
computers
(
:workstation
).
developer
)
# this next line will fail if the attribute methods module is generated lazily
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录