Я пытаюсь заполнить базу данных, используя методы модели, но она не заполняет поля правильно.Во-первых, мои начальные данные выглядят так:
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, однако при чтении и принятии оба значения показывают ноль вместопредустановленные значения, которые я пытался определить.Где моя ошибка в этом?Вот все методы, которые используются в модели:
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 я пытаюсь обновить это поле, только если с момента последнего чтения прошло более недели, и только если это поле равно нулю.Есть ли лучший способ написать это?