To_Json覆盖Ruby

时间:2009-12-24 11:45:16

标签: ruby-on-rails ruby

我在Ruby中有一个名为Post的对象。 我想将帖子转换为json,但我也希望包含发布帖子的用户的姓名。事情是在post对象中不存在user_name,但是用户id是。

所以我真正想要的是这样的事情

{name:"My Post", body:"My post data", user_name:"jhonny"}

当我在Post对象上执行to_json时,我得到了

{name:"My Post", body:"My post data"}

但我也希望将user_name:"jhonny"部分加入其中。我知道我可以使它成为哈希,然后在哈希上做to_json,但我不想手动为所有post值设置哈希值,因为要发布许多属性。我宁愿使用哈希合并函数将附加属性添加到哈希,然后在其上调用json。

有没有办法为ruby类创建一个快速哈希对象?任何想法都会受到欢迎。

这样的东西
my_post.hash.merge{:user_name => "jhonny"}.to_json

干杯。

2 个答案:

答案 0 :(得分:4)

回答你的问题应该是这样的

my_post.attributes.merge{:user_name => "jhonny"}.to_json

无论如何,如果这不起作用,那么只需尝试以下解决方案之一:

将此添加到您的Post型号:

def to_json
  ActiveRecord::JSON.decode(super).merge({:user_name => user.user_name}).to_json
end

另一种解决方案是将user_name方法添加到Post模型中:

def user_name
  user.user_name
end

然后使用to_json,如下所示:

my_post.to_json(:methods => :username)

答案 1 :(得分:0)

如果您的Post模型是ActiveRecord模型,它接受:except,:include和:仅用于序列化方法的参数,包括#to_json。请参阅详细信息和示例here in the AR documentation

基本上你需要像

这样的东西
my_post.to_json(:include => { :user => { :only => :user_name } })