2016-02-18 2 views
1

Мне нужно обновить некоторые записи навалом, используя ActiveXRecord's #update_all.Rails массовое обновление с условием

values = {} 
values[:developer_id] = value 
values[:status] = 2 # if issue.status == 1 
issues.update_all(values) 

мне нужно, чтобы убедиться, чтобы обновить статус, только если его значение равно 1, так что я не знаю, как я могу добиться того, что без зацикливания вопросов и проверить каждый из них и обновить столбцы (п + 1).

EDIT

Для того, чтобы вопрос ясно, мне нужно обновить все столбцы для developer_id все вопросы и обновлять статус, только если == статус 1.

Как обновить в объем и применение этого условия в одно и то же время?

+0

Как раз это имеет смысл, было сделано замечание о том, что OP только хочет обновить статус, если статус 1, но хочет обновить developer_id во всех случаях. В этом случае вам, вероятно, понадобится использовать рукописный SQL, похожий на статус status = CASE КОГДА 1 ТОГДА 2 ELSE status END. Это, вероятно, будет отличаться в зависимости от используемой базы данных. – rdubya

+0

Я редактировал вопрос, я думал, что это понятно, извините за это. –

+0

Вы не можете сделать это в одном запросе. Вы должны сделать это в двух запросах. Сначала обновите 'developer_id', а затем' status'. Почему это должен быть один запрос? – Mischa

ответ

0

Используйте активную запись, чтобы выбрать единственные строки, у которых status есть 1, а затем обновите их навалом.

issues = Issue.where(status: 1) 

или цепь его с update_all

issues.where(status: 1).update_all(values) 

Оба будут запрашивать непосредственно в базе данных, поэтому N + 1 не должно произойти.

+0

Пожалуйста, прочитайте мой комментарий к @rdybya –

+0

Умм, в этом случае потребуется, по крайней мере, два запроса, чтобы избежать N + 1. Один для всех данных, другой для условных данных. – Babar

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