【问题标题】:Rails to_json - exact order of existing columnsRails to_json - 现有列的确切顺序
【发布时间】:2026-01-05 04:30:02
【问题描述】:

我的任务是为 jqGrid 形成 JSON 数据。它需要一个特殊的格式:

{
    total: 50,
    page:"1",
    records: "1500",
    rows: [
        { 20, "{2ae39c44-ca9d-4565-9e05-bbd875c1579c}", "Description 1"},
        { 23, "{e1aaf69d-1040-4afa-8995-fd15c3a591b3}", "Description 2"},
        { 25, "{e3df29c7-ef34-46ba-bf66-7838aca7c137}", "Description 3"},
        { 29, "{768ec164-28e5-4614-a259-63257b79e8e0}", "Description 4"}
    ]
}

所以“行”的基本规则是:不生成根对象名称,列出不带名称的字段,按确切顺序列出字段以绑定到相应的列。

我可以强制 to_json 方法根据需要修改输出吗?

目前 to_json 产生:

myobjs : [
myobj : { id: 20, uuid: "{2ae39c44-ca9d-4565-9e05-bbd875c1579c}", name: "Description 1"},
myobj : { id: 20, uuid: "{e1aaf69d-1040-4afa-8995-fd15c3a591b3}", name: "Description 2"},
myobj : { id: 20, uuid: "{e3df29c7-ef34-46ba-bf66-7838aca7c137}", name: "Description 3"},
myobj : { id: 20, uuid: "{768ec164-28e5-4614-a259-63257b79e8e0}", name: "Description 4"}
]

【问题讨论】:

  • 您可以直接覆盖它并自己生成正确的输出,不是吗?
  • 是的,我可以,但是有没有不覆盖的标准方法?

标签: ruby-on-rails json jqgrid customization


【解决方案1】:

您无法通过模型级别的to_json 调用来做到这一点,您需要像@Paul 所说的那样构建中间数据表示。比如:

class MyObj
  def to_json
    [id, uuid, name]
  end
end

然后在控制器中:

class MyController < ApplicationController
  def grid_data
    objs = MyObj.all
    json_data = {
      :total => objs.count,
      :page => 1,
      :records => 1500,
      :rows => objs.collect {|o| o.to_json}
    }
    ... send json as usual ...
  end
end

请注意,我将您的模型设置为生成一个数组,而不是您指定的哈希,因为我认为您复制了错误 - 您上面的 JSON 示例无效。 { 20, 'foo', 'bar' } 不是有效的 JSON,因为 "{...}" 表示一个哈希,它必须是键控的,并且没有排序。

【讨论】:

  • 覆盖to_json 是一种反模式。覆盖serializable_hash 是一种更强大的方法。
  • 嘿,有罪。但更清楚的是,你为下一个明显覆盖的人做了什么。如果您按照@x1a4 的建议做正确的事,看在上帝的份上,请评论 why
最近更新 更多