有时候这样做很方便,存储包含任意Ruby 对象的属性直接到数据库的表中。Active
Record 通过序列化Ruby 对象到一个字符串中(使用YAML 格式)来支持这种方式,并且存储这
个字符串到数据库内对应此属性的列中。在schema 中,这个列必须被定义为text 类型。
因为Active Record 通常将映射一个character 或text 列为一个纯Ruby 字符串,在你
想获得这个功能的优势时,你需要告诉Active Record 使用序列化。例如,我们想记录最后
五位购买者做为我们客户。我们将创建一个包含一个text 列的表来保存这些信息。
create table purchases (
id int not null auto_increment,
name varchar(100) not null,
last_five text,
primary key (id)
);
在Active Record 类中包装这个表,我们将使用serialize()声明来告诉Active Record
要marshal 对象到这个列中。
class Purchase < ActiveRecord::Base
serialize :last_five
# ...
end
当我们创建新的Purchase 对象时,我们可以给last_five 列赋值任何Ruby 对象。在这
个例子中,我们设置它为一个字符串数组。
purchase = Purchase.new
purchase.name = "Dave Thomas"
purchase.last_five = [ 'shoes', 'shirt', 'socks', 'ski mask',
'shorts' ]
purchase.save
当稍后我们读它时,属性被设置回一个数组。
purchase = Purchase.find_by_name("Dave Thomas")
pp purchase.last_five
pp purchase.last_five[3]
这个代码输出
["shoes", "shirt", "socks", "ski mask", "shorts"]
"ski mask"
尽管强大和方便,如果你想在Ruby 应用程序的外部来使用序列化内的信息还有些问题。
除非应用程序理解YAML 格式,因为列内容对它是不透明的。事实上,很难在SQL 查询的内部
使用结构(structure)。相反,你可能考虑使用对象聚合来代替,它描述在247 页15.2 节,
来达到同样的效果。
Record 通过序列化Ruby 对象到一个字符串中(使用YAML 格式)来支持这种方式,并且存储这
个字符串到数据库内对应此属性的列中。在schema 中,这个列必须被定义为text 类型。
因为Active Record 通常将映射一个character 或text 列为一个纯Ruby 字符串,在你
想获得这个功能的优势时,你需要告诉Active Record 使用序列化。例如,我们想记录最后
五位购买者做为我们客户。我们将创建一个包含一个text 列的表来保存这些信息。
create table purchases (
id int not null auto_increment,
name varchar(100) not null,
last_five text,
primary key (id)
);
在Active Record 类中包装这个表,我们将使用serialize()声明来告诉Active Record
要marshal 对象到这个列中。
class Purchase < ActiveRecord::Base
serialize :last_five
# ...
end
当我们创建新的Purchase 对象时,我们可以给last_five 列赋值任何Ruby 对象。在这
个例子中,我们设置它为一个字符串数组。
purchase = Purchase.new
purchase.name = "Dave Thomas"
purchase.last_five = [ 'shoes', 'shirt', 'socks', 'ski mask',
'shorts' ]
purchase.save
当稍后我们读它时,属性被设置回一个数组。
purchase = Purchase.find_by_name("Dave Thomas")
pp purchase.last_five
pp purchase.last_five[3]
这个代码输出
["shoes", "shirt", "socks", "ski mask", "shorts"]
"ski mask"
尽管强大和方便,如果你想在Ruby 应用程序的外部来使用序列化内的信息还有些问题。
除非应用程序理解YAML 格式,因为列内容对它是不透明的。事实上,很难在SQL 查询的内部
使用结构(structure)。相反,你可能考虑使用对象聚合来代替,它描述在247 页15.2 节,
来达到同样的效果。