Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails 4更新所有语法-参数错误_Ruby On Rails 4_Arguments_Rails Activerecord_Update All - Fatal编程技术网

Ruby on rails 4 Rails 4更新所有语法-参数错误

Ruby on rails 4 Rails 4更新所有语法-参数错误,ruby-on-rails-4,arguments,rails-activerecord,update-all,Ruby On Rails 4,Arguments,Rails Activerecord,Update All,我得到了一个错误: 参数数量错误(2对1) 在我的任务模型上,当我定义更新所有任务状态的方法时。正确的语法是什么 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}) #=> erro

我得到了一个错误:

参数数量错误(2对1)

在我的
任务
模型上,当我定义更新所有任务状态的方法时。正确的语法是什么

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
类任务此处出错
结束
结束
结束
类GroupIdsByStatus
def self.group(选项={})
结果=Hash.new{| h,k | h[k]=[]}
选项。减少(结果)do |缓冲区,(id,状态)|

buffer[status.to_sym]方法
update_all
接收单个散列作为其唯一参数。您需要将所有更新放在单个参数中:

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
user.tasks.update\u all(状态:status.to\s,id:id)
#上述代码行与以下代码相同:
#user.tasks.update_all({status:status.to_s,id:ids})#<注意花括号

有关此方法的更多信息显示在

中,我这样做了,但现在它显示了另一个错误:ActiveRecord::StatementInvalid in TasksController#toggle SQLite3::MismatchException:数据类型不匹配:UPDATE“tasks”SET“status”=“done”、“id”=NULL,其中“tasks”。“user_id”=?这是正确的语法,因此问题得到了解决。新问题是由
ids
变量为
NULL
引起的。您需要确保
ids
不是
NULL
,以防止出现该错误。