Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
f1a534af
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,发现更多精彩内容 >>
提交
f1a534af
编写于
12月 01, 2011
作者:
J
Jon Leighton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove the need for type_cast_attribute.
This is good because it reduces duplication.
上级
47b97a73
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
52 addition
and
43 deletion
+52
-43
activerecord/lib/active_record/attribute_methods.rb
activerecord/lib/active_record/attribute_methods.rb
+4
-0
activerecord/lib/active_record/attribute_methods/read.rb
activerecord/lib/active_record/attribute_methods/read.rb
+31
-31
activerecord/lib/active_record/attribute_methods/serialization.rb
...cord/lib/active_record/attribute_methods/serialization.rb
+0
-8
activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb
...b/active_record/attribute_methods/time_zone_conversion.rb
+16
-3
activerecord/lib/active_record/base.rb
activerecord/lib/active_record/base.rb
+1
-1
未找到文件。
activerecord/lib/active_record/attribute_methods.rb
浏览文件 @
f1a534af
...
...
@@ -29,6 +29,10 @@ def attribute_methods_generated?
end
end
def
generated_attribute_methods
@generated_attribute_methods
||=
(
base_class
==
self
?
super
:
base_class
.
generated_attribute_methods
)
end
def
undefine_attribute_methods
if
base_class
==
self
super
...
...
activerecord/lib/active_record/attribute_methods/read.rb
浏览文件 @
f1a534af
...
...
@@ -33,7 +33,7 @@ def undefine_attribute_methods
if
base_class
==
self
generated_attribute_methods
.
module_eval
do
public_methods
(
false
).
each
do
|
m
|
singleton_class
.
send
(
:undef_method
,
m
)
if
m
.
to_s
=~
/^
cast
_/
singleton_class
.
send
(
:undef_method
,
m
)
if
m
.
to_s
=~
/^
attribute
_/
end
end
end
...
...
@@ -49,27 +49,27 @@ def undefine_attribute_methods
# The second, slower, branch is necessary to support instances where the database
# returns columns with extra stuff in (like 'my_column(omg)').
def
define_method_attribute
(
attr_name
)
access_code
=
attribute_access_code
(
attr_name
)
cast_code
=
"v && (
#{
attribute_cast_code
(
attr_name
)
}
)"
internal
=
internal_
attribute_access_code
(
attr_name
)
external
=
external_attribute_access_code
(
attr_name
)
if
attr_name
=~
ActiveModel
::
AttributeMethods
::
NAME_COMPILABLE_REGEXP
generated_attribute_methods
.
module_eval
<<-
STR
,
__FILE__
,
__LINE__
def
#{
attr_name
}
#{
access_code
}
#{
internal
}
end
def self.
cast_
#{
attr_name
}
(v
)
#{
cast_code
}
def self.
attribute_
#{
attr_name
}
(v, attributes_cache, attr_name
)
#{
external
}
end
STR
else
generated_attribute_methods
.
module_eval
do
define_method
(
attr_name
)
do
eval
(
access_code
)
eval
(
internal
)
end
singleton_class
.
send
(
:define_method
,
"
cast_
#{
attr_name
}
"
)
do
|
v
|
eval
(
cast_code
)
singleton_class
.
send
(
:define_method
,
"
attribute_
#{
attr_name
}
"
)
do
|
v
,
attributes_cache
,
attr_name
|
eval
(
external
)
end
end
end
...
...
@@ -80,7 +80,7 @@ def cacheable_column?(column)
attribute_types_cached_by_default
.
include?
(
column
.
type
)
end
def
attribute_access_code
(
attr_name
)
def
internal_
attribute_access_code
(
attr_name
)
access_code
=
"(v=@attributes['
#{
attr_name
}
']) &&
#{
attribute_cast_code
(
attr_name
)
}
"
unless
attr_name
==
self
.
primary_key
...
...
@@ -94,6 +94,16 @@ def attribute_access_code(attr_name)
access_code
end
def
external_attribute_access_code
(
attr_name
)
access_code
=
"v &&
#{
attribute_cast_code
(
attr_name
)
}
"
if
cache_attribute?
(
attr_name
)
access_code
=
"attributes_cache[attr_name] ||= (
#{
access_code
}
)"
end
access_code
end
def
attribute_cast_code
(
attr_name
)
columns_hash
[
attr_name
].
type_cast_code
(
'v'
)
end
...
...
@@ -103,36 +113,26 @@ def attribute_cast_code(attr_name)
# "2004-12-12" in a data column is cast to a date object, like Date.new(2004, 12, 12)).
def
read_attribute
(
attr_name
)
attr_name
=
attr_name
.
to_s
caster
=
"cast
_
#{
attr_name
}
"
accessor
=
"attribute
_
#{
attr_name
}
"
methods
=
self
.
class
.
generated_attribute_methods
if
methods
.
respond_to?
(
caste
r
)
if
methods
.
respond_to?
(
accesso
r
)
if
@attributes
.
has_key?
(
attr_name
)
@attributes_cache
[
attr_name
]
||
methods
.
send
(
caster
,
@attributes
[
attr_name
]
)
methods
.
send
(
accessor
,
@attributes
[
attr_name
],
@attributes_cache
,
attr_name
)
end
elsif
!
self
.
class
.
attribute_methods_generated?
# If we haven't generated the caster methods yet, do that and
# then try again
self
.
class
.
define_attribute_methods
read_attribute
(
attr_name
)
else
_read_attribute
attr_name
end
end
def
_read_attribute
(
attr_name
)
attr_name
=
attr_name
.
to_s
attr_name
=
self
.
class
.
primary_key
if
attr_name
==
'id'
unless
@attributes
[
attr_name
].
nil?
type_cast_attribute
(
column_for_attribute
(
attr_name
),
@attributes
[
attr_name
])
# If we get here, the attribute has no associated DB column, so
# just return it verbatim.
@attributes
[
attr_name
]
end
end
private
def
type_cast_attribute
(
column
,
value
)
if
column
column
.
type_cast
(
value
)
else
value
end
end
def
attribute
(
attribute_name
)
read_attribute
(
attribute_name
)
end
...
...
activerecord/lib/active_record/attribute_methods/serialization.rb
浏览文件 @
f1a534af
...
...
@@ -77,14 +77,6 @@ def set_serialized_attributes
end
end
def
type_cast_attribute
(
column
,
value
)
if
column
&&
self
.
class
.
serialized_attributes
[
column
.
name
]
value
.
unserialized_value
else
super
end
end
def
type_cast_attribute_for_write
(
column
,
value
)
if
column
&&
coder
=
self
.
class
.
serialized_attributes
[
column
.
name
]
Attribute
.
new
(
coder
,
value
,
:unserialized
)
...
...
activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb
浏览文件 @
f1a534af
...
...
@@ -19,12 +19,15 @@ module ClassMethods
# Defined for all +datetime+ and +timestamp+ attributes when +time_zone_aware_attributes+ are enabled.
# This enhanced read method automatically converts the UTC time stored in the database to the time
# zone stored in Time.zone.
def
attribute_access_code
(
attr_name
)
if
create_time_zone_conversion_attribute?
(
attr_name
,
columns_hash
[
attr_name
])
def
internal_attribute_access_code
(
attr_name
)
column
=
columns_hash
[
attr_name
]
if
create_time_zone_conversion_attribute?
(
attr_name
,
column
)
<<-
CODE
cached = @attributes_cache['
#{
attr_name
}
']
return cached if cached
time = _read_attribute('
#{
attr_name
}
')
v = @attributes['
#{
attr_name
}
']
time =
#{
column
.
type_cast_code
(
'v'
)
}
@attributes_cache['
#{
attr_name
}
'] = time.acts_like?(:time) ? time.in_time_zone : time
CODE
else
...
...
@@ -32,6 +35,16 @@ def attribute_access_code(attr_name)
end
end
def
external_attribute_access_code
(
attr_name
)
column
=
columns_hash
[
attr_name
]
if
create_time_zone_conversion_attribute?
(
attr_name
,
column
)
"attributes_cache[attr_name] ||= (
#{
attribute_cast_code
(
attr_name
)
}
)"
else
super
end
end
def
attribute_cast_code
(
attr_name
)
if
create_time_zone_conversion_attribute?
(
attr_name
,
columns_hash
[
attr_name
])
"v.acts_like?(:time) ? v.in_time_zone : v"
...
...
activerecord/lib/active_record/base.rb
浏览文件 @
f1a534af
...
...
@@ -1821,7 +1821,7 @@ def attribute_for_inspect(attr_name)
# Returns true if the specified +attribute+ has been set by the user or by a database load and is neither
# nil nor empty? (the latter only applies to objects that respond to empty?, most notably Strings).
def
attribute_present?
(
attribute
)
value
=
_
read_attribute
(
attribute
)
value
=
read_attribute
(
attribute
)
!
value
.
nil?
||
(
value
.
respond_to?
(
:empty?
)
&&
!
value
.
empty?
)
end
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录