如何在执行重复的Rails时更新属性

时间:2018-10-09 16:05:34

标签: ruby ruby-on-rails-5

我们正在创建一个计划应用程序,并尝试为每个星期的计划创建一个复制/粘贴功能。我试图弄清楚如何在特定时间段内重复计划,同时在粘贴时更新属性。现在,我可以复制日程安排,但是在邮递员上运行日程时,日期和时间保持完全相同(如我们期望的那样,使用.dup。)我相信最好将开始/结束时间设置为nil和然后粘贴时属性可能会在那时更新?

这是我到目前为止拥有的功能:

def copy
    set_calendar
    if params["start_date"] && params["end_date"]
       start_date = params["start_date"].to_date
       end_date = params["end_date"].to_date
        if @calendar.users.owners.include?(current_user) || @calendar.users.managers.include?(current_user)
            @past_shifts = Shift.where(calendar_id: @calendar.id, start_time: start_date.beginning_of_day .. end_date.end_of_day).to_a
            if
              @past_shifts.each do |past_shift|
                shift = past_shift.dup
                shift.users = past_shift.users
                shift.update(shift_params)
                shift.save
              end
             render json: "copied", status: :ok
            else
             render json: @usershift.errors, status: :uprocessable_entity
            end
        else
            render json: ("You do not have access to copy shifts"), status: :unauthorized
        end
    end
end

shift.update(shift_params)是需要更新开始时间和结束时间的部分。这是轮班参数:

def shift_params
    params.permit(:start_time, :end_time, :calendar_id, :capacity, :published)
end

就关系建立而言,此当前方法是在班次控制器中创建的。 Shift通过用户转移有很多用户,用户通过用户转移有很多转移,并且usershift模型属于两者。

1 个答案:

答案 0 :(得分:0)

很好奇-您确定params方法的copy包含start_timeend_time的值吗?如果是这样,为什么不直接使用它们:

shift.start_time = params['start_time']
shift.end_time   = params['end_time']

使用shift_params,您还将更新其他3个属性::calendar_id, :capacity, :published。不知道在这种情况下是否有必要。

在这种情况下,使用shift.update方法是不合理的。它与现有记录一起使用,并将更新的属性保存到数据库中。对于您而言,该记录是新记录,您可以稍后再调用shift.save保存所有更改。