Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
33283c98
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,发现更多精彩内容 >>
提交
33283c98
编写于
5月 06, 2013
作者:
R
Rafael Mendonça França
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10234 from dasch/dasch/fetch-multi
Allow fetching multiple values from the cache at once
上级
925728c2
36d41a15
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
61 addition
and
1 deletion
+61
-1
activesupport/CHANGELOG.md
activesupport/CHANGELOG.md
+13
-1
activesupport/lib/active_support/cache.rb
activesupport/lib/active_support/cache.rb
+28
-0
activesupport/test/caching_test.rb
activesupport/test/caching_test.rb
+20
-0
未找到文件。
activesupport/CHANGELOG.md
浏览文件 @
33283c98
*
No changes.
*
Add a
`fetch_multi`
method to the cache stores. The method provides
an easy to use API for fetching multiple values from the cache.
Example:
# Calculating scores is expensive, so we only do it for posts
# that have been updated. Cache keys are automatically extracted
# from objects that define a #cache_key method.
scores = Rails.cache.fetch_multi(*posts) do |post|
calculate_score(post)
end
*Daniel Schierbeck*
Please check
[
4-0-stable
](
https://github.com/rails/rails/blob/4-0-stable/activesupport/CHANGELOG.md
)
for previous changes.
activesupport/lib/active_support/cache.rb
浏览文件 @
33283c98
...
...
@@ -352,6 +352,34 @@ def read_multi(*names)
results
end
# Fetches data from the cache, using the given keys. If there is data in
# the cache with the given keys, then that data is returned. Otherwise,
# the supplied block is called for each key for which there was no data,
# and the result will be written to the cache and returned.
#
# Options are passed to the underlying cache implementation.
#
# Returns an array with the data for each of the names. For example:
#
# cache.write("bim", "bam")
# cache.fetch_multi("bim", "boom") {|key| key * 2 }
# #=> ["bam", "boomboom"]
#
def
fetch_multi
(
*
names
)
options
=
names
.
extract_options!
options
=
merged_options
(
options
)
results
=
read_multi
(
*
names
,
options
)
names
.
map
do
|
name
|
results
.
fetch
(
name
)
do
value
=
yield
name
write
(
name
,
value
,
options
)
value
end
end
end
# Writes the value to the cache, with the key.
#
# Options are passed to the underlying cache implementation.
...
...
activesupport/test/caching_test.rb
浏览文件 @
33283c98
...
...
@@ -257,6 +257,26 @@ def test_read_multi_with_expires
assert_equal
({
"fu"
=>
"baz"
},
@cache
.
read_multi
(
'foo'
,
'fu'
))
end
def
test_fetch_multi
@cache
.
write
(
'foo'
,
'bar'
)
@cache
.
write
(
'fud'
,
'biz'
)
values
=
@cache
.
fetch_multi
(
'foo'
,
'fu'
,
'fud'
)
{
|
value
|
value
*
2
}
assert_equal
([
"bar"
,
"fufu"
,
"biz"
],
values
)
assert_equal
(
"fufu"
,
@cache
.
read
(
'fu'
))
end
def
test_multi_with_objects
foo
=
stub
(
:title
=>
"FOO!"
,
:cache_key
=>
"foo"
)
bar
=
stub
(
:cache_key
=>
"bar"
)
@cache
.
write
(
'bar'
,
"BAM!"
)
values
=
@cache
.
fetch_multi
(
foo
,
bar
)
{
|
object
|
object
.
title
}
assert_equal
([
"FOO!"
,
"BAM!"
],
values
)
end
def
test_read_and_write_compressed_small_data
@cache
.
write
(
'foo'
,
'bar'
,
:compress
=>
true
)
assert_equal
'bar'
,
@cache
.
read
(
'foo'
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录