Ruby on rails Rails未定义的方法`更新属性';对于[]:数组

Ruby on rails Rails未定义的方法`更新属性';对于[]:数组,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我在尝试更新atributtes时出错 C:\Rails\App>rake reklamer:iqmedier (in C:/Rails/App) rake aborted! undefined method `update_attributes' for []:Array C:/Rails/App/lib/tasks/statistik.rake:23:in `block (2 levels) in <top (required)&g

我在尝试更新atributtes时出错

   C:\Rails\App>rake reklamer:iqmedier
    (in C:/Rails/App)
    rake aborted!
    undefined method `update_attributes' for []:Array
    C:/Rails/App/lib/tasks/statistik.rake:23:in `block (2 levels) in
     <top (required)>'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:634:in `call'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:634:in `block in execute'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:629:in `each'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:629:in `execute'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain'
    C:/Ruby192/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:581:in `invoke'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2019:in `each'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:1992:in `run'
    C:/Ruby192/bin/rake:31:in `<main>'

ActiveRecord的
#find(:all,…)
返回一个记录数组,而不是单个记录。如果要更新所有匹配的记录,可以执行
@existing.each{r | r.update_attributes(…)}
。如果要更新单个记录,则需要执行
Reklamer.find(:first,…)
,条件是确保只匹配要更新的记录。

ActiveRecord的
#find(:all,…)
返回一个记录数组,而不是单个记录。如果要更新所有匹配的记录,可以执行
@existing.each{r | r.update_attributes(…)}
。如果要更新单个记录,则需要执行
Reklamer.find(:first,…)
,条件是确保只匹配要更新的记录。

问题是您正在查找所有记录,而无法更新数组,因此有两个选项:

(1) 更新所有匹配的Reklamer对象:

@existing = Reklamer.find(:all, :conditions => {:dato => @stats[0]})
  if @existing.empty?
      Reklamer.create!(:virksomhed => 'Iqmedier', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  else
    @existing.each{ |e| e.update_attributes(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8]) }
  end
(2) 仅更新Reklamer对象的单个实例:

@existing = Reklamer.find(:first, :conditions => {:dato => @stats[0]})
  if @existing.nil?
      Reklamer.create!(:virksomhed => 'Iqmedier', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  else
    @existing.update_attributes(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  end

问题是您正在查找全部,并且无法更新数组,因此有两个选项:

(1) 更新所有匹配的Reklamer对象:

@existing = Reklamer.find(:all, :conditions => {:dato => @stats[0]})
  if @existing.empty?
      Reklamer.create!(:virksomhed => 'Iqmedier', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  else
    @existing.each{ |e| e.update_attributes(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8]) }
  end
(2) 仅更新Reklamer对象的单个实例:

@existing = Reklamer.find(:first, :conditions => {:dato => @stats[0]})
  if @existing.nil?
      Reklamer.create!(:virksomhed => 'Iqmedier', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  else
    @existing.update_attributes(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  end

如何防止重复。示例一列时间是:2011-02-15 23:53:28,它创建了一个新的时间:2011-02-15 00:00:00。如何预防呢?这是有道理的。这些是不同的时代,因此比较它们不会导致平等。这与您在这里遇到的问题不同,因此我建议您创建一个新的问题线索,详细说明您试图完成的任务。别忘了把这个问题标记为已被接受:)我不明白为什么它现在创造了100%的重复?时间是一样的,我想我是在检查重复的。你发布的两次是不同的“2011-02-15 23:53:28”并不等同于“2011-02-15 00:00:00”。虽然他们在同一天,但他们相隔23小时53分28秒。这几乎是一整天的差异。我现在已经测试过了,它正在创建一个100%的副本。时间是2011-02-15 00:00:00和2011-02-15 00:00:00如何防止重复。示例一列时间是:2011-02-15 23:53:28,它创建了一个新的时间:2011-02-15 00:00:00。如何预防呢?这是有道理的。这些是不同的时代,因此比较它们不会导致平等。这与您在这里遇到的问题不同,因此我建议您创建一个新的问题线索,详细说明您试图完成的任务。别忘了把这个问题标记为已被接受:)我不明白为什么它现在创造了100%的重复?时间是一样的,我想我是在检查重复的。你发布的两次是不同的“2011-02-15 23:53:28”并不等同于“2011-02-15 00:00:00”。虽然他们在同一天,但他们相隔23小时53分28秒。这几乎是一整天的差异。我现在已经测试过了,它正在创建一个100%的副本。时间是2011-02-15 00:00:00和2011-02-15 00:00:00