2014-02-19 5 views
0

Использование Rails 3.2. Как показано в doc on update method, то update находок на основе id:Rails обновление нескольких записей на основе другого идентификатора

update(id, attributes) 
# id - This should be the id or an array of ids to be updated. 

# Updates multiple records 
people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy" } } 
Person.update(people.keys, people.values) 

Что делать, если я хочу, чтобы обновить массив найдено на основе других столбцов? Например:

people = { 'cook' => { "first_name" => "David" }, 'server' => { "first_name" => "Jeremy" } } 

Найти людей с role = cook, а затем обновить first_name = David; находите людей с role = server, а затем обновите first_name = jeremy.

Я хочу, чтобы это было сделано в 1 запросе, если это возможно, а не SQL. Благодарю.

+0

Попробуйте update_all http://apidock.com/rails/ActiveRecord/Base/update_all/class –

+0

Был ли какой-либо из ответов разработан для вас? – Pavan

ответ

0

Вы можете добиться этого с #update_all

people = { 'cook' => { "first_name" => "David" }, 'server' => { "first_name" => "Jeremy" } } 

Person.update_all(people.keys, people.values) 
0

Метод update не выполняет 1 SQL запрос, когда передается массив идентификаторов и значений. Если вы просмотрите исходный код для update, вы увидите, что он проходит через массив и выполняет 2 запроса для каждой записи (поиск и запрос на обновление), чтобы затем вернуть массив обновленных объектов.

Если вы счастливы принять, что вам нужно будет сделать 2 запроса в строке, вы можете использовать следующий код для поиска людей по ролям.

people = { 'cook' => { "first_name" => "David" }, 'server' => { "first_name" => "Jeremy" } } 

updated_people = people.keys.map.with_index do |role, index| 
    object = Person.where(role: role).first! 
    object.update(people.values[index]) 
    object 
end 

Примечание: Этот код обновляет только первую запись он находит на роль, потому что я предполагал, что будет только один повар с именем «Давид».

Если вы хотите использовать только один оператор SQL, вы должны посмотреть на его выполнение в SQL, как предположил Devanand.

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