我正在尝试使用模型方法为数据库设置种子,但是它没有正确填充字段。首先,我的种子数据如下:
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时,我才尝试更新该字段。有没有更好的方法来写这个?
答案 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
的原始结果