gpt4 book ai didi

ruby-on-rails - 如何将 joins 方法与 first_or_initialize 一起使用而不是 find_or_initialize_by (Rails)?

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:39 25 4
gpt4 key购买 nike

有没有办法重写下面的流程,目前使用find_or_initialize_by,使用joins方法?

对于上下文 - 我有 users(员工)在系统中记录他们的 attendances(user 有很多 attendances考勤记录属于用户)。

Attendance.find_or_initialize_by(
user: User.find_by(name: 'Bob'),
date: Time.zone.today
)
.update(...) # Update some columns after this

我正在尝试使用 .joins 重写它,如下所示:

Attendance.joins(:user)
.where(users: {name: 'Bob'}, date: Time.zone.today)
.first_or_initialize
.update(...) # Update some columns after this

我的测试结果喜忧参半:

  • 只需要更新记录的测试用例通过
  • attendance 记录尚不存在的测试案例(即我必须initialize 的案例)失败

错误信息是ActiveRecord::RecordInvalid:验证失败:用户必须存在。但我很困惑,因为用户确实存在 - 如果我使用 byebug 进行调试,用户就在那里。

最佳答案

与其从出勤模型开始,我更倾向于从用户开始,像这样:

User.find_by(name: 'Bob').attendances.find_or_initialize_by(date: Time.zone.today).update(...)

这使事情易于阅读。您可以添加一个关联扩展方法来使事情更方便:

class User < ActiveRecord::Base
has_many :attendances do
def for_date(date)
find_or_initialize_by(date: Time.zone.today)
end
end
end

# Then call with:
User.attendances.for_date(Time.zone.today)

根据您对该出勤记录所做的操作,您还可以让您的 for_date 方法接受额外的参数。

first_or_initialize 已根据以下内容删除:https://api.rubyonrails.org/classes/ActiveRecord/Relation.html . 感谢@engineersmnky 的更正。该方法未记录,但看起来像是一个错误。

关于ruby-on-rails - 如何将 joins 方法与 first_or_initialize 一起使用而不是 find_or_initialize_by (Rails)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56217535/

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