【问题标题】:Why is this create statement giving the error "ArgumentError: wrong number of arguments (1 for 2)"?为什么这个 create 语句会给出错误“ArgumentError: wrong number of arguments (1 for 2)”?
【发布时间】:2014-08-15 20:13:47
【问题描述】:

通过 Rake 任务导入 CSV 文件并将其存储在多个表中这个看似简单的任务遇到了麻烦。

我的耙子任务:

desc "Imports the COGCC CSV file into wikifrac database"
task :import_cogcc => :environment do

    require 'csv'

    CSV.foreach('public/partial.csv', :headers => true) do |row|

        # create records in independent tables

        # create the Company object
        this_company_name = row['name'].strip!
        this_operator_num = row['operator_num']

        if !(Companies.exists?(:company_name => this_company_name))
          Companies.create(:company_name => this_company_name, :operator_num => this_operator_num)
        end
        thecompany = Companies.find(:first, :conditions => ["this_company_name = ?", this_company_name])
        company_id = thecompany.id

...

我的公司模型:

class Companies < ActiveRecord::Base
  has_many :facilities, dependent: :destroy
  attr_accessor :company_name, :operator_num

  def initialize(company_name, operator_num)
    @operator_num = operator_num  
    @company_name = company_name  
  end

end

但是当我运行 rake import_partial 时,我得到了这个错误:

rake 中止! ArgumentError:参数数量错误(1 对 2) wfrails/app/models/companies.rb:5:in initialize' wfrails/lib/tasks/import_partial.rake:47:in block(2 级)在 ' wfrails/lib/tasks/import_partial.rake:26:in `block in ' 任务:TOP => import_cogcc

谁能告诉我这有什么问题?一直在兜兜转转; SO中有很多类似的例子,但不能完全解决我的错误......

【问题讨论】:

  • 你为什么要覆盖initializeActiveRecord provides several ways 使用其属性批量初始化模型。为什么要向模型添加实例变量?那些不应该存储在数据库中吗? AR create 方法无法使用您创建的新 initialize
  • 只要摆脱你的initialize 方法,一切都会奏效。
  • 您可能要考虑使用事务并创建!这样您就不会在 rake 任务失败时创建模型
  • 谢谢大家;删除初始化做到了...

标签: ruby-on-rails ruby rake


【解决方案1】:

错误是因为您在 rake 任务中使用哈希调用 create。哈希算作 1 个对象(您使用的语法在其周围有隐式花括号,因此您实际上是在传递 {:company_name =&gt; this_company_name, :operator_num =&gt; this_operator_num}),而您已覆盖 initialize 方法以分别采用 2 个参数。因此,它抱怨它只在期望 2 的地方找到 1 个参数。

简单的方法

由于您使用的是 activerecord,我会按照 BroiSatse 所说的去做,只需删除您的初始化覆盖方法。这将允许哈希正常工作,并会自动设置您发送的属性。

特殊情况

如果出于某种原因,您想将这两个变量设置为初始化的一部分,我会确保您调用 super 以便正确设置对象的其余部分。

ruby def initialize(params={}) super self.operator_num = params[:operator_num] self.company_name = params[:company_name] end

但只有在运行任何回调之前需要设置这些属性时,我才会这样做。

【讨论】:

  • 感谢详细的回复...信息量很大!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
相关资源
最近更新 更多