当多个外键关联记录存在时,Rails的has_one关联如何转换为长尾?

2026-04-11 15:261阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计588个文字,预计阅读时间需要3分钟。

当多个外键关联记录存在时,Rails的has_one关联如何转换为长尾?

如果正确理解了has_one,则意味着在相关记录上存在外键。这意味着您可以在外国表面上拥有多个相关记录。当使用has_one关系获取相关记录时,如何确定返回的是哪一个,取决于外键的值和数据库中记录的具体情况。例如,对于Job Act类:

pythonclass JobAct: def get_related_record(self, foreign_key_value): # 假设有一个数据库查询函数 related_record=database.query(SELECT * FROM related_table WHERE foreign_key=%s, foreign_key_value) return related_record

在这个例子中,`get_related_record`方法接受一个外键值,然后查询相关表,返回与该外键值匹配的记录。确保传入正确的`foreign_key_value`是获取正确记录的关键。

如果我正确理解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]

当我尝试从JobRequest获取activity_state时,如何确定返回哪一个?

JobRequest.find(1).activity_state #=> #<ActivityState id: 1, job_id: 1>

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

如果我想返回创建的最新版本怎么办?

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

当多个外键关联记录存在时,Rails的has_one关联如何转换为长尾?

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列重置为null来强制执行“每个记录一个关联”概念.您的原始代码无意中绕过了执法.如果您将其更改为此代码行,您将允许Rails发挥其魔力并确保与您的关联一致的行为.

本文共计588个文字,预计阅读时间需要3分钟。

当多个外键关联记录存在时,Rails的has_one关联如何转换为长尾?

如果正确理解了has_one,则意味着在相关记录上存在外键。这意味着您可以在外国表面上拥有多个相关记录。当使用has_one关系获取相关记录时,如何确定返回的是哪一个,取决于外键的值和数据库中记录的具体情况。例如,对于Job Act类:

pythonclass JobAct: def get_related_record(self, foreign_key_value): # 假设有一个数据库查询函数 related_record=database.query(SELECT * FROM related_table WHERE foreign_key=%s, foreign_key_value) return related_record

在这个例子中,`get_related_record`方法接受一个外键值,然后查询相关表,返回与该外键值匹配的记录。确保传入正确的`foreign_key_value`是获取正确记录的关键。

如果我正确理解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]

当我尝试从JobRequest获取activity_state时,如何确定返回哪一个?

JobRequest.find(1).activity_state #=> #<ActivityState id: 1, job_id: 1>

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

如果我想返回创建的最新版本怎么办?

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

当多个外键关联记录存在时,Rails的has_one关联如何转换为长尾?

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列重置为null来强制执行“每个记录一个关联”概念.您的原始代码无意中绕过了执法.如果您将其更改为此代码行,您将允许Rails发挥其魔力并确保与您的关联一致的行为.