Это может быть нечто большее, чем StackOverflow, больше для основной команды.
Кажется, что либо ActiveResource глупо о том, как он общается с RESTful-клиентом, или ActiveRecord глупо о том, как он слушает одного (или альтернатива, и гораздо более вероятный вариант, эти две вещи просто принципиально не могут разговаривать друг с другом.)
С другой стороны: указанные выше пользователь, служба и группа, мой интерфейс, после размещения запроса PUT на внутреннем сервере по адресу /users/1.xml, серверный журнал регистрирует следующие параметры (некоторые значения удалены для краткости):
{"user"=>
{"created_at"=>2011-06-23 02:58:15 UTC,
"id"=>1,
"name"=>"John Metta",
"updated_at"=>2011-06-23 02:58:15 UTC,
"managed_groups"=>[],
"services"=>[
{"created_at"=>2011-06-23 02:58:15 UTC,
"id"=>1,
"updated_at"=>2011-06-23 02:58:15 UTC,
"user_id"=>1}
],
"groups"=>[
{"created_at"=>2011-06-23 02:56:37 UTC,
"id"=>1,
"updated_at"=>2011-06-23 02:56:37 UTC,
"user_id"=>nil,
"users"=>[
{"created_at"=>2011-06-23 03:36:28 UTC,
"id"=>6,
"name"=>"Jefferey",
"updated_at"=>2011-06-23 03:36:28 UTC},
{"created_at"=>2011-06-23 02:59:36 UTC,
"id"=>2,
"name"=>"George",
"updated_at"=>2011-06-23 03:05:13 UTC}
]
},
{"created_at"=>2011-06-23 02:56:37 UTC,
"id"=>1,
"name"=>"Site Admin",
"updated_at"=>2011-06-23 02:56:37 UTC,
"user_id"=>nil,
"users"=>[
{"created_at"=>2011-06-23 03:36:28 UTC,
"id"=>6,
"name"=>"Jefferey",
"updated_at"=>2011-06-23 03:36:28 UTC},
{"created_at"=>2011-06-23 02:59:36 UTC,
"id"=>2,
"name"=>"George",
"updated_at"=>2011-06-23 03:05:13 UTC},
{"created_at"=>2011-06-23 02:58:15 UTC,
"id"=>1,
"name"=>"John Metta",
"updated_at"=>2011-06-23 02:58:15 UTC}
]
}
]
},
"id"=>"1"}
Итак, я вижу несколько проблем с ActiveResource (или, более вероятно, как я пытаюсь использовать ActiveResource), но главное заключается в следующем:
Поскольку ActiveResource, похоже, ничего не знает об ассоциациях, он просто тупо объединяет все. Другими словами, ActiveResource тупо говорит: «Да, у вас есть список групп, поэтому я назову его« группами »вместо того, чтобы знать, что для того, чтобы это на самом деле работало, нужно сказать:« Хм, у вас есть список групп, а Group - другая модель, я назову ее groups_attributes, чтобы ее можно было перестроить в список групп на другом конце.
Теперь, прежде чем я разгорячился, я понимаю, что 'groups_attributes' - это словарь ActiveRecord, а не общее слово REST, поэтому, если ActiveResource начнет его использовать, он сломает, скажем, мой другой бэкэнд, который работает на Scala .
Однако , учитывая, что Rails должен быть в состоянии работать с Rails, и учитывая, что ActiveResource должен быть глупым об этом, тогда кажется, что ActiveRecord должен быть в состоянии выяснить, что "Эта входящая модель RESTful содержит объекты, отображающие эту карту на известные модели, на которые есть ссылки, давайте попробуем создать эти модели и заставить их работать.
Работоспособное решение:
Я не думал об этом достаточно, чтобы чувствовать себя комфортно, предполагая, что ActiveRecord должен всегда автоматически пытаться отобразить включенные параметры входящего набора параметров с именем MODEL в MODEL. Это потребует дополнительного тестирования и обдумывания. Однако мое решение состояло в том, чтобы перехватить этот входящий набор параметров в users_controller с помощью чего-то вроде следующего:
…
begin
groups = []
params[:user][:groups].each do |g|
groups << Group.find(g[:id])
end
params[:user][:groups] = groups
rescue
# Do something not incredibly stupid here
end
…
Который, кажется, захватывает вещи относительно чисто. Я боюсь, что это кажется довольно громоздким для Rails - у которого обычно есть намного более элегантные решения вещей - и что я упускаю что-то простое.
(В интересах завершения я понимаю, что с этой строкой параметров есть и другие проблемы, например: поскольку я связываю группу с пользователем, а пользователь с группой, я передаю тонну данных вокруг обязательно (например, вся группа и все ее пользователи), когда я передаю пользователя. Для этого нужен какой-то прокси-сервер, например список идентификаторов групп или что-то в этом роде. Скорее всего, в моих моделях ActiveResource должны быть методы, обертывающие эти объекты. рассматриваю эти проблемы за рамками этого вопроса.)