2016-09-02 2 views
1

Если у меня есть объект «Bill», я могу создать экземпляр счета через REST API, назначив питание, заказанное для счета, когда я пойду, чтобы создать новый счет.Параметры отправки Rails с массивом id vs array of objects

т.е. я мог бы сделать запрос POST для www.server.com/api/bills со следующими параметрами:

{ 
    cost: 30.0, 
    foods: [23, 1, 14] 
} 

это лучше отправить массив идентификаторов или это нормальная практика, чтобы отправить массив объектов? Примерно:

{ 
    cost: 30.0, 
    foods: [ 
     { 
      id: 23, 
      name: "Chicken Parmesan", 
      price: 10.0 
     }, 
     { 
      id: 1, 
      name: "Scotch Fillet Steak", 
      price: 10.0 
     }, 
     { 
      id: 14, 
      name: "Baramundi", 
      price: 10.0 
     }, 
    ] 
} 

ответ

3

Да, отправка идентификаторов в порядке, хотя вы хотите проверить, что назначенный идентификатор является законным.

Если у вас еще нет идентификаторов, и вы хотите создавать объекты (или обновлять!) Через ассоциацию - отправка вложенного массива с объектами - это путь.

Также забыл упомянуть! Если вы отправляете только ids - это означает, что вы отправляете специальное поле для рельсов - food_ids, а Rails - волшебство. Это просто обновление поля, это правда REST.

Я бы пошел с food_ids, если мне не нужно менять или создавать продукты, и я бы пошел с foods_attributes (вложенными атрибутами), если мне нужно.

+0

Интересно, поэтому отправка 'food_ids: [23, 1,14]' приведет к тому, что Rails обновит существующий экземпляр счета в БД и свяжет соответствующий элемент питания с векселем, если разработчику не потребуется вручную писать код, и назначить элементы. Это ново для меня: D – Zhang

+0

Точно! Но в целом я настоятельно рекомендую иметь валидацию внутри модели, которая гарантирует, что все назначенные идентификаторы действительны. (или просто внешний ключ в базе данных должен быть в порядке, если нет «особых» продуктов питания, которые не могут быть назначены на счет) – shlajin

+1

Дополнительный важный совет Я изучил трудный путь - при отправке массива объектов НЕ ВКЛЮЧАЙТЕ id дочернего объекта, отправлять только другие атрибуты дочернего объекта. В противном случае Rails считает, что вы пытаетесь обновить существующий родительский объект, используя идентификатор дочернего объекта, но не может этого сделать, потому что вы никогда не укажете id родительского объекта. Циклическое уважение ... не знаю, что именно называется: D – Zhang