gpt4 book ai didi

mysql - Rails-使用模型文件中的方法保存时丢失数据

转载 作者:行者123 更新时间:2023-11-29 23:23:33 24 4
gpt4 key购买 nike

我正在尝试为商家创建一个日程安排应用程序。我有一个“工作”类,使用以下架构:

create_table "jobs", force: true do |t| 
t.string "job_num"
t.string "project"
t.string "store_num"
t.string "store_name"
t.string "address"
t.date "start_date"
t.date "end_date"
t.time "time"
t.integer "sched_hrs"
t.integer "manpower"
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "sat", default: false
t.boolean "sun", default: false
t.string "timezone"
end

大多数工作不包括周六或周日的工作时间,因此我的方法的一部分旨在包括或跳过这些日子。剩下的只是在另一个名为“Shifts”的模型中创建新的表行——工作可能跨越很多天,我需要为工作跨越的每一天创建一个新条目(没有商店信息)。这是我的乔布斯模型:

  class Job < ActiveRecord::Base
has_and_belongs_to_many :agents
has_many :shifts

attr_reader :id, :start_date, :end_date, :sched_hrs, :manpower

validates :job_num, presence: true
validates :project, presence: true
validates :store_num, presence: true
validates :store_name, presence: true
validates :address, presence: true
validates :start_date, presence: true
validates :end_date, presence: true
validates :time, presence: true
validates :sched_hrs, presence: true
validates :manpower, presence: true


after_create :splay


private

def splay

@now_date = Date.parse(@start_date)
@end_dt = Date.parse(@end_date)
@j_id = @id
@j_sh = @sched_hrs
@j_mp = @manpower

while @now_date <= @end_dt do

if @now_date.saturday? == false && @now_date.sunday? == false
Shift.create(job_id: @j_id, shift_date: @now_date, shift_hrs: @j_sh, shift_req_agents: @j_mp, shift_available_agents: 0 )
end

if @now_date.saturday? == true && self.sat == true
Shift.create(job_id: @j_id, shift_date: @now_date, shift_hrs: @j_sh, shift_req_agents: @j_mp, shift_available_agents: 0 )
end

if @now_date.sunday? == true && self.sun == true
Shift.create(job_id: j_id, shift_date: @now_date, shift_hrs: @j_sh, shift_req_agents: @j_mp, shift_available_agents: 0 )
end

@now_date += 1

end

end
end

经过多次尝试和错误,我得到了保存到类次表中的值。但是,当我检查作业中的表行时,传递给该方法的任何参数都不会保存,这会导致 NoMethod forNilClass 错误。因为我使用的是 Job 类中的 :id,所以它使我的 Job 表行无法找到(没有 :id)。

我在这里做错了什么?该代码是否应该在其他地方 - 例如在辅助文件中还是在 Controller 中?我很困惑。

最佳答案

作为解决问题的开始,您的“Sunday”条件代码引用 j_id:

if @now_date.sunday? == true && self.sun == true
Shift.create(job_id: j_id, shift_date: @now_date, shift_hrs: @j_sh, shift_req_agents: @j_mp, shift_available_agents: 0 )
end

您只定义了 @j_id 而不是 j_id,因此 j_id 可能是 nil

您还可以通过删除 job_id: @j_id 来利用您的 has_many 关联:

  @job = Job.find(@id)
@job.shifts << Shift.create(shift_date: @now_date, shift_hrs: @j_sh, shift_req_agents: @j_mp, shift_available_agents: 0 )

通常,您可以在 Controller 操作中处理 form 输入时创建关联的 Shift 记录。也就是说,如果您实际上是通过 Controller 操作获取此数据。

此外,您可以减少一点逻辑。例如:

  if @now_date.saturday? == true && self.sat == true

可以简化为:

  if @now_date.saturday? && self.sat

因为 .saturday?.sat 都返回 bool 值。

关于mysql - Rails-使用模型文件中的方法保存时丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27118171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com