Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
f4853dc1
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,发现更多精彩内容 >>
提交
f4853dc1
编写于
11月 30, 2011
作者:
J
Jon Leighton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Extract attribute serialization code into a separate module
上级
61489dc6
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
49 addition
and
28 deletion
+49
-28
activerecord/lib/active_record.rb
activerecord/lib/active_record.rb
+1
-0
activerecord/lib/active_record/attribute_methods/read.rb
activerecord/lib/active_record/attribute_methods/read.rb
+5
-28
activerecord/lib/active_record/attribute_methods/serialization.rb
...cord/lib/active_record/attribute_methods/serialization.rb
+42
-0
activerecord/lib/active_record/base.rb
activerecord/lib/active_record/base.rb
+1
-0
未找到文件。
activerecord/lib/active_record.rb
浏览文件 @
f4853dc1
...
...
@@ -92,6 +92,7 @@ module AttributeMethods
autoload
:Read
autoload
:TimeZoneConversion
autoload
:Write
autoload
:Serialization
end
end
...
...
activerecord/lib/active_record/attribute_methods/read.rb
浏览文件 @
f4853dc1
...
...
@@ -34,22 +34,12 @@ def cache_attribute?(attr_name)
protected
def
define_method_attribute
(
attr_name
)
if
serialized_attributes
.
include?
(
attr_name
)
define_read_method_for_serialized_attribute
(
attr_name
)
else
define_read_method
(
attr_name
,
attr_name
,
columns_hash
[
attr_name
])
end
define_read_method
(
attr_name
,
attr_name
,
columns_hash
[
attr_name
])
end
private
def
cacheable_column?
(
column
)
serialized_attributes
.
include?
(
column
.
name
)
||
attribute_types_cached_by_default
.
include?
(
column
.
type
)
end
# Define read method for serialized attribute.
def
define_read_method_for_serialized_attribute
(
attr_name
)
access_code
=
"@attributes_cache['
#{
attr_name
}
'] ||= @attributes['
#{
attr_name
}
']"
generated_attribute_methods
.
module_eval
(
"def _
#{
attr_name
}
;
#{
access_code
}
; end; alias
#{
attr_name
}
_
#{
attr_name
}
"
,
__FILE__
,
__LINE__
)
attribute_types_cached_by_default
.
include?
(
column
.
type
)
end
# Define an attribute reader method. Cope with nil column.
...
...
@@ -107,28 +97,15 @@ def _read_attribute(attr_name)
value
=
@attributes
[
attr_name
]
unless
value
.
nil?
if
column
=
column_for_attribute
(
attr_name
)
if
unserializable_attribute?
(
attr_name
,
column
)
unserialize_attribute
(
attr_name
)
else
column
.
type_cast
(
value
)
end
type_cast_attribute
(
column
,
value
)
else
value
end
end
end
# Returns true if the attribute is of a text column and marked for serialization.
def
unserializable_attribute?
(
attr_name
,
column
)
column
.
text?
&&
self
.
class
.
serialized_attributes
.
include?
(
attr_name
)
end
# Returns the unserialized object of the attribute.
def
unserialize_attribute
(
attr_name
)
coder
=
self
.
class
.
serialized_attributes
[
attr_name
]
unserialized_object
=
coder
.
load
(
@attributes
[
attr_name
])
@attributes
.
frozen?
?
unserialized_object
:
@attributes
[
attr_name
]
=
unserialized_object
def
type_cast_attribute
(
column
,
value
)
#:nodoc:
column
.
type_cast
(
value
)
end
private
...
...
activerecord/lib/active_record/attribute_methods/serialization.rb
0 → 100644
浏览文件 @
f4853dc1
module
ActiveRecord
module
AttributeMethods
module
Serialization
extend
ActiveSupport
::
Concern
module
ClassMethods
def
define_method_attribute
(
attr_name
)
if
serialized_attributes
.
include?
(
attr_name
)
generated_attribute_methods
.
module_eval
(
<<-
CODE
,
__FILE__
,
__LINE__
)
def _
#{
attr_name
}
@attributes_cache['
#{
attr_name
}
'] ||= @attributes['
#{
attr_name
}
']
end
alias
#{
attr_name
}
_
#{
attr_name
}
CODE
else
super
end
end
def
cacheable_column?
(
column
)
serialized_attributes
.
include?
(
column
.
name
)
||
super
end
end
def
type_cast_attribute
(
column
,
value
)
coder
=
self
.
class
.
serialized_attributes
[
column
.
name
]
if
column
.
text?
&&
coder
unserialized_object
=
coder
.
load
(
@attributes
[
column
.
name
])
if
@attributes
.
frozen?
unserialized_object
else
@attributes
[
column
.
name
]
=
unserialized_object
end
else
super
end
end
end
end
end
activerecord/lib/active_record/base.rb
浏览文件 @
f4853dc1
...
...
@@ -2219,6 +2219,7 @@ def populate_with_current_scope_attributes
include
AttributeMethods
::
PrimaryKey
include
AttributeMethods
::
TimeZoneConversion
include
AttributeMethods
::
Dirty
include
AttributeMethods
::
Serialization
include
ActiveModel
::
MassAssignmentSecurity
include
Callbacks
,
ActiveModel
::
Observing
,
Timestamp
include
Associations
,
NamedScope
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录