2012-05-18 6 views
0

У меня есть задача сформировать данные JSON для jqGrid. Для этого требуется специальный формат:Rails to_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"} 
] 
+0

Вы можете просто переопределить его и произвести правильный вывод самостоятельно, не так ли? –

+0

Да, я могу, но есть ли стандартный способ без переопределения? – Paul

ответ

0

Вы не можете сделать это с моделью уровня 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, поскольку «{...}» представляет хэш, который должен быть введен в ключ и не упорядочен.

+0

Превращение 'to_json' является анти-шаблоном. Переопределение ['serializable_hash'] (http://stackoverflow.com/questions/5000870/defaults-for-to-json-in-rails-with-include) является более надежным способом его выполнения. – x1a4

+1

Хех, виновен в качестве обвинения. Но гораздо яснее, что вы делаете для следующего парня с очевидным переопределением. Если вы поступите правильно, как @ x1a4 предлагает, ради бога, комментарий _why_. –

+0

Полностью согласен с этим. – x1a4

Смежные вопросы