首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >要散列的Rails对象

要散列的Rails对象
EN

Stack Overflow用户
提问于 2010-10-06 20:10:01
回答 7查看 119.3K关注 0票数 163

我已经创建了以下对象

代码语言:javascript
复制
@post = Post.create(:name => 'test', :post_number => 20, :active => true)

保存后,我希望能够将对象返回到散列,例如,通过执行以下操作:

代码语言:javascript
复制
@object.to_hash

这在rails内部是如何实现的呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-06 20:12:41

如果您只查找属性,则可以通过以下方式获取它们:

代码语言:javascript
复制
@post.attributes

请注意,每次调用时都会调用ActiveModel::AttributeSet.to_hash,因此,如果需要多次访问散列,则应将其缓存在局部变量中:

代码语言:javascript
复制
attribs = @post.attributes
票数 322
EN

Stack Overflow用户

发布于 2016-03-04 02:17:29

您可以使用以下任一方法获取作为散列返回的模型对象的属性

代码语言:javascript
复制
@post.attributes

代码语言:javascript
复制
@post.as_json

as_json允许您包括关联及其属性,并指定要包括/排除的属性(请参阅documentation)。但是,如果您只需要基本对象的属性,在我的应用程序中使用ruby 2.2.3和rails 4.2.2进行基准测试表明,attributes所需的时间不到as_json的一半。

代码语言:javascript
复制
>> 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)
票数 10
EN

Stack Overflow用户

发布于 2010-10-06 21:09:50

你绝对可以使用这些属性来返回所有的属性,但是你也可以在Post中添加一个实例方法,将其命名为"to_hash“,然后让它以散列的形式返回你想要的数据。就像这样

代码语言:javascript
复制
def to_hash
 { name: self.name, active: true }
end
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3872236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档