Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
a2b847ae
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,发现更多精彩内容 >>
提交
a2b847ae
编写于
7月 03, 2013
作者:
A
Aaron Patterson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
keep a cache of the reader methods so we can reuse them
上级
501b27e7
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
50 addition
and
34 deletion
+50
-34
activerecord/lib/active_record/attribute_methods.rb
activerecord/lib/active_record/attribute_methods.rb
+48
-0
activerecord/lib/active_record/attribute_methods/read.rb
activerecord/lib/active_record/attribute_methods/read.rb
+2
-34
未找到文件。
activerecord/lib/active_record/attribute_methods.rb
浏览文件 @
a2b847ae
...
...
@@ -28,6 +28,54 @@ def self.set_name_cache(name, value)
end
}
ReaderMethodCache
=
Class
.
new
{
include
Mutex_m
def
initialize
super
@module
=
Module
.
new
@method_cache
=
{}
end
# We want to generate the methods via module_eval rather than
# define_method, because define_method is slower on dispatch.
# Evaluating many similar methods may use more memory as the instruction
# sequences are duplicated and cached (in MRI). define_method may
# be slower on dispatch, but if you're careful about the closure
# created, then define_method will consume much less memory.
#
# But sometimes the database might return columns with
# characters that are not allowed in normal method names (like
# 'my_column(omg)'. So to work around this we first define with
# the __temp__ identifier, and then use alias method to rename
# it to what we want.
#
# We are also defining a constant to hold the frozen string of
# the attribute name. Using a constant means that we do not have
# to allocate an object on each call to the attribute method.
# Making it frozen means that it doesn't get duped when used to
# key the @attributes_cache in read_attribute.
def
[]
(
name
)
synchronize
do
@method_cache
.
fetch
(
name
)
{
safe_name
=
name
.
unpack
(
'h*'
).
first
temp_method
=
"__temp__
#{
safe_name
}
"
ActiveRecord
::
AttributeMethods
::
AttrNames
.
set_name_cache
safe_name
,
name
@module
.
module_eval
<<-
STR
,
__FILE__
,
__LINE__
+
1
def
#{
temp_method
}
name = ::ActiveRecord::AttributeMethods::AttrNames::ATTR_
#{
safe_name
}
read_attribute(name) { |n| missing_attribute(n, caller) }
end
STR
@method_cache
[
name
]
=
@module
.
instance_method
temp_method
}
end
end
}.
new
module
ClassMethods
def
inherited
(
child_class
)
#:nodoc:
child_class
.
initialize_generated_modules
...
...
activerecord/lib/active_record/attribute_methods/read.rb
浏览文件 @
a2b847ae
...
...
@@ -32,41 +32,9 @@ def cache_attribute?(attr_name)
protected
# We want to generate the methods via module_eval rather than
# define_method, because define_method is slower on dispatch.
# Evaluating many similar methods may use more memory as the instruction
# sequences are duplicated and cached (in MRI). define_method may
# be slower on dispatch, but if you're careful about the closure
# created, then define_method will consume much less memory.
#
# But sometimes the database might return columns with
# characters that are not allowed in normal method names (like
# 'my_column(omg)'. So to work around this we first define with
# the __temp__ identifier, and then use alias method to rename
# it to what we want.
#
# We are also defining a constant to hold the frozen string of
# the attribute name. Using a constant means that we do not have
# to allocate an object on each call to the attribute method.
# Making it frozen means that it doesn't get duped when used to
# key the @attributes_cache in read_attribute.
def
define_method_attribute
(
name
)
safe_name
=
name
.
unpack
(
'h*'
).
first
temp_method
=
"__temp__
#{
safe_name
}
"
ActiveRecord
::
AttributeMethods
::
AttrNames
.
set_name_cache
safe_name
,
name
generated_attribute_methods
.
module_eval
<<-
STR
,
__FILE__
,
__LINE__
+
1
def
#{
temp_method
}
name = ::ActiveRecord::AttributeMethods::AttrNames::ATTR_
#{
safe_name
}
read_attribute(name) { |n| missing_attribute(n, caller) }
end
STR
generated_attribute_methods
.
module_eval
do
alias_method
name
,
temp_method
undef_method
temp_method
end
method
=
ActiveRecord
::
AttributeMethods
::
ReaderMethodCache
[
name
]
generated_attribute_methods
.
module_eval
{
define_method
name
,
method
}
end
private
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录