我已经创建了以下对象
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
保存后,我希望能够将对象返回到散列,例如,通过执行以下操作:
@object.to_hash
这在rails内部是如何实现的呢?
发布于 2010-10-06 20:12:41
如果您只查找属性,则可以通过以下方式获取它们:
@post.attributes
请注意,每次调用时都会调用ActiveModel::AttributeSet.to_hash
,因此,如果需要多次访问散列,则应将其缓存在局部变量中:
attribs = @post.attributes
发布于 2016-03-04 02:17:29
您可以使用以下任一方法获取作为散列返回的模型对象的属性
@post.attributes
或
@post.as_json
as_json
允许您包括关联及其属性,并指定要包括/排除的属性(请参阅documentation)。但是,如果您只需要基本对象的属性,在我的应用程序中使用ruby 2.2.3和rails 4.2.2进行基准测试表明,attributes
所需的时间不到as_json
的一半。
>> p = Problem.last
Problem Load (0.5ms) SELECT "problems".* FROM "problems" ORDER BY "problems"."id" DESC LIMIT 1
=> #<Problem id: 137, enabled: true, created_at: "2016-02-19 11:20:28", updated_at: "2016-02-26 07:47:34">
>>
>> p.attributes
=> {"id"=>137, "enabled"=>true, "created_at"=>Fri, 19 Feb 2016 11:20:28 UTC +00:00, "updated_at"=>Fri, 26 Feb 2016 07:47:34 UTC +00:00}
>>
>> p.as_json
=> {"id"=>137, "enabled"=>true, "created_at"=>Fri, 19 Feb 2016 11:20:28 UTC +00:00, "updated_at"=>Fri, 26 Feb 2016 07:47:34 UTC +00:00}
>>
>> n = 1000000
>> Benchmark.bmbm do |x|
?> x.report("attributes") { n.times { p.attributes } }
?> x.report("as_json") { n.times { p.as_json } }
>> end
Rehearsal ----------------------------------------------
attributes 6.910000 0.020000 6.930000 ( 7.078699)
as_json 14.810000 0.160000 14.970000 ( 15.253316)
------------------------------------ total: 21.900000sec
user system total real
attributes 6.820000 0.010000 6.830000 ( 7.004783)
as_json 14.990000 0.050000 15.040000 ( 15.352894)
发布于 2010-10-06 21:09:50
你绝对可以使用这些属性来返回所有的属性,但是你也可以在Post中添加一个实例方法,将其命名为"to_hash“,然后让它以散列的形式返回你想要的数据。就像这样
def to_hash
{ name: self.name, active: true }
end
https://stackoverflow.com/questions/3872236
复制相似问题