Как обновить подобъект с помощью mql
Я работаю над счетчиком калорий и могу создавать новые рецепты, но у меня возникают проблемы при попытке обновить ингредиент.
Я могу создать ингредиент со следующим mql:
{
id: recipeId,
'/food/recipe/ingredients': {
create: 'unless_exists',
id: null,
quantity: parseFloat( row.$quantity.val() ),
unit: {
id: row.$units.val()
},
ingredient: {
id: row.ingredientId
}
}
}
Однако, если я изменю меру ингредиента, скажем, от 2 до 3 чашек, этот запрос создаст новый ингредиент. Я пытался обновить запись. Пока что я пробовал:
{
connect: 'update',
id: row.rowId,
type: '/food/recipe_ingredient',
quantity: parseFloat( row.$quantity.val() ),
unit: {
id: row.$units.val()
},
ingredient: {
id: row.ingredientId
}
}
Это приводит к ошибке: Can't use [], [{}] or {} in a write
,
{
connect: 'update',
id: row.rowId,
type: '/food/recipe_ingredient',
quantity: parseFloat( row.$quantity.val() )
}
Результаты в ошибке: Can't use 'connect' at the root of the query
,
{
id: recipeId,
'/food/recipe/ingredients': {
connect: 'update',
id: row.rowId,
type: '/food/recipe_ingredient',
quantity: parseFloat( row.$quantity.val() )
}
}
Я получаю ошибку: Can't use 'connect': 'update' on a non-unique master property
,
{
id: row.rowId,
type: '/food/recipe_ingredient',
quantity: {
connect: 'update',
value: parseFloat( row.$quantity.val() )
}
}
Результаты в ошибке: This value is already in use. Please delete it first.
Это единственный способ удалить старый ингредиент и добавить новый?
Если единственный способ состоит в том, чтобы удалить старые записи и заменить их, есть ли способ удалить все ингредиенты одновременно, а не по отдельности с помощью таких запросов, как:
{
id: recipeId,
'/food/recipe/ingredients': {
connect: 'delete',
id: row.rowId
}
}
1 ответ
Это не "подобъект", а отдельный узел. Я бы посоветовал прочитать о вариаторах или типах медиаторов. Чтобы изменить его свойства, вам нужно переместить соединение во внутренний запрос.
Вот рецепт дрожжевого ингредиента из моего рецепта теста для пиццы
Этот запрос обновит количество для дрожжей (при условии, что есть только один узел ингредиента, определяющий дрожжи):
[{
"id": "/m/0wh8nkh",
"/food/recipe/ingredients": [{
"ingredient": {
"id": "/en/yeast"
},
"quantity": {
"connect": "update",
"value": 2
},
"unit": {
"id": "/en/teaspoon",
"connect": "update"
}
}]
}]
но вместо того, чтобы полагаться на уникальность ингредиентов, я бы посоветовал извлечь и сохранить идентификаторы узлов ингредиентов, чтобы вы могли явно ссылаться на них в своем запросе.
Некоторые другие примечания: - вы не должны создавать новые блюда для каждого рецепта. Многие блюда уже должны существовать во Freebase, и вы должны позволить пользователю выбирать их отдельно от рецепта. - Вам нужно добавить / common / topic в создаваемые вами блюда и рецепты (но не в CVT для ингредиентов)
Здорово, что вы используете песочницу, чтобы не портить производственную базу данных во время отладки.