无法正确播种Rails

时间:2019-03-20 15:38:45

标签: ruby-on-rails

我正在尝试使用模型方法为数据库设置种子,但是它没有正确填充字段。首先,我的种子数据如下:

5.times do
  @battery = Battery.create
end

pan1 = Pan.create(battery_id: Battery.first.id, date: '2019-01-02', reading: 8.0, amount: nil, advisement: 700, acceptance: 87.5)

15.times do
  Pan.create(battery_id: Battery.first.id, date: pan1.date += 3.days, reading: Pan.reads, amount: Pan.ratings, advisement: Pan.advise, acceptance: Pan.accept, accepted: nil)
end

现在我从数据库中看到的第一个问题是正在创建panel1,但是,读取,接受都显示nil,而不是我尝试定义的预设值。我的错误在哪里?这里是模型中使用的所有方法:

class Pan < ApplicationRecord
  belongs_to :battery

  def self.reads
    @pans = Pan.all
    @pans.each do |pan|
      if pan.reading == nil && pan.date >= 1.week.ago
        pan.update_attributes!(reading: rand(5.0..18.0))
      else
        pan.update_attributes!(reading: nil)
      end
    end
  end

  def self.ratings
    @pans = Pan.all
    @pans.each do |pan|
      pan.update_attributes!(amount: rand(200..20000))
    end
  end

  def self.advise
    @pans = Pan.all
    @pans.each do |pan|
      if pan.reading != nil && (pan.reading < 9.0 || pan.reading > 14.0)
        pan.update_attributes!(advisement: rand(200..20000))
      end
    end
  end

  def self.accept
    @pans = Pan.all
    @pans.each do |pan|
      if pan.reading != nil && pan.amount != nil
        accepted = pan.amount/pan.reading
      elsif pan.reading != nil && pan.advisement != nil
        accepted = pan.advisement/pan.reading
      end

      pan.update_attributes!(acceptance: accepted)
    end
  end
end

我试图通过每种方法一次更新一个属性,然后在种子文件中调用它。这是做这件事的好方法吗?

我的两个问题是为什么pan1不能正确播种,当我自己仅创建panel1时,读取和接受设置为它们的预定义值,但是当我添加15.times时,它们被设置了为空?

第二,在self.reads中,仅当自上次阅读以来已经超过一周,并且仅当该字段为nil时,我才尝试更新该字段。有没有更好的方法来写这个?

1 个答案:

答案 0 :(得分:2)

一个问题是,所有类方法self.reads self.ratings self.advise self.accept都以each方法的结果结尾,每个方法的结果是始终是原始数组,而您正在尝试在此字段reading: Pan.reads, amount: Pan.ratings, advisement: Pan.advise, acceptance: Pan.accept

中分配一个数组

第二个问题是所有这些方法都会更新Pan模型的所有记录,因此,当您调用15.times块时,此方法会更新pan的原始结果