【问题标题】:To_Json overriding in RubyRuby 中的 To_Json 覆盖
【发布时间】:2009-12-24 11:45:16
【问题描述】:

我在 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,但我不想手动为所有帖子值生成散列,因为要发布的属性很多。我宁愿使用哈希合并函数将附加属性添加到哈希,然后在其上调用 json。

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

类似

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

干杯。

【问题讨论】:

  • 我找到了像 ActiveRecord::JSON.decode(my_post.to_json).merge({:user_name => "jhonny"}).to_json 这样的方法,但这是一个糟糕的 hack。我想要一种更简洁的方法来解决这个问题。
  • 我不认为这是一个糟糕的 hack。您只需将 post 更改为 json,然后返回到散列,然后合并用户名,然后将整个散列转换回 json。如果在某些情况下失败,那将是一个糟糕的 hack。

标签: ruby-on-rails ruby


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

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

    基本上你需要类似的东西

    my_post.to_json(:include => { :user => { :only => :user_name } })
    

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 2011-06-26
      • 2011-02-04
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多