1

Я получаю сообщение об ошибке:Rails синтаксис 4 update_all - ошибка Довод

Wrong number of arguments (2 for 1)

На моей модели Task когда я определила мой метод, чтобы обновить статус всех задач. Каков правильный синтаксис?

class Task < ActiveRecord::Base 
    belongs_to :user 

    def self.toggle(user, groups) 
    groups.each do |status, ids| 
     user.tasks.update_all({status: status.to_s}, {id: ids}) #=> error here 
    end 
    end 
end 

class GroupIdsByStatus 
    def self.group(options = {}) 
    result = Hash.new {|h,k| h[k] = []} 
    options.reduce(result) do |buffer, (id, status)| 
     buffer[status.to_sym] << id 
     buffer 
    end 
    result 
    end 
end 

class TasksController < ApplicationController 
    def toggle 
    groups = GroupIdsByStatus.group(params[:tasks]) 
    Task.toggle(current_user, groups) 

    redirect_to tasks_path 
    end 
end 

ответ

1

Метод update_all получает единственный Hash в качестве единственного аргумента. Вы должны поместить все обновления в один аргумент:

user.tasks.update_all(status: status.to_s, id: ids) 

# The above line of code is identical to: 
# user.tasks.update_all({status: status.to_s, id: ids}) # < Notice the curly braces 

Более подробная информация по этому методу показан в Rails Relation Docs

+0

я сделал это, но теперь он показывает другую ошибку: ActiveRecord :: StatementInvalid в TasksController #toggle SQLite3 :: MismatchException: несоответствие типов данных: UPDATE "tasks" SET "status" = 'done', "id" = NULL WHERE "tasks". "user_id" =? –

+0

Это правильный синтаксис, поэтому проблема решена. Проблема * new * вызвана переменной 'ids' как' NULL'. Вы хотите убедиться, что 'ids' не' NULL', чтобы предотвратить получение этой ошибки. –

+0

Хорошо, спасибо Уэс Фостер! Я проверю это, спасибо. –