gpt4 book ai didi

ruby-on-rails - 当有多个带有外键的记录时,Rails has_one 关联

转载 作者:行者123 更新时间:2023-12-01 09:55:54 25 4
gpt4 key购买 nike

如果我明白 has_one正确,外键在相关记录上。这意味着我可以在“外国”方面拥有多个相关记录。当我使用 has_one记录获取关联记录,我如何确定将返回哪一个?

下面是一个例子:

class Job < ActiveRecord::Base
has_one :activity_state
end

class ActivityState < ActiveRecord::Base
belongs_to :job
end

假设 activity_states 中有 2 行外键设置为 Job #1 的表
ActivityState.where(job_id: 1).select(:id, :job_id)
#=> [#<ActivityState id: 1, job_id: 1>, #<ActivityState id: 2, job_id: 1]

当我尝试获取 activity_state 时从 JobRequest 中,我如何确定返回的是哪个?
JobRequest.find(1).activity_state
#=> #<ActivityState id: 1, job_id: 1>

现在,看起来它正在返回它找到的第一个。

如果我想返回创建的最新一个怎么办?

最佳答案

正如评论中所讨论的,主要问题是您的系统正在创建多个 ActivityState每个作业的对象。正如您所提到的,您的原始代码是这样做的:

ActivityState.create(job_id: @job.id)

问题是旧的 ActivityState仍然包含 job_id对于那份工作。因此,当您执行 @job.activity_state 时,您确实看到了第一个(也是旧的)事件状态,因为它是数据库中的第一个。具体来说, has_one关系执行 LIMIT 1 sql 子句,因此从技术上讲,“第一条”记录取决于您的数据库对记录进行排序(通常按条目顺序)

通常,对于 has_one关系,如果你要做
@job.activity_state = ActivityState.new(...activity state params...)

Rails 试图通过重置“旧”关联记录的 job_id 来强制执行“每个记录一个关联”的概念。列为空。您的原始代码无意中绕过了该强制措施。如果您改为将其更改为这行代码,您将允许 Rails 发挥其魔力并确保与您的关联行为一致。

关于ruby-on-rails - 当有多个带有外键的记录时,Rails has_one 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27662313/

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