Ruby on rails 当有多个记录具有外键时,Rails有一个关联
如果我正确理解Ruby on rails 当有多个记录具有外键时,Rails有一个关联,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,如果我正确理解有一个,则外键位于相关记录上。这意味着我可以在“国外”方面有多个相关记录。当我使用has_one记录获取相关记录时,我如何确定将返回哪一条记录 下面是一个例子: class Job < ActiveRecord::Base has_one :activity_state end class ActivityState < ActiveRecord::Base belongs_to :job end 当我试图从JobRequest获取活动\u状态时,如何
有一个
,则外键位于相关记录上。这意味着我可以在“国外”方面有多个相关记录。当我使用has_one
记录获取相关记录时,我如何确定将返回哪一条记录
下面是一个例子:
class Job < ActiveRecord::Base
has_one :activity_state
end
class ActivityState < ActiveRecord::Base
belongs_to :job
end
当我试图从JobRequest获取活动\u状态
时,如何确定返回的是哪一个
JobRequest.find(1).activity_state
#=> #<ActivityState id: 1, job_id: 1>
JobRequest.find(1).活动\u状态
#=> #
现在,它似乎正在返回它找到的第一个
如果我想返回创建的最新版本,该怎么办?在这种情况下,您应该有很多关联。要基于列返回特定记录,请创建一个方法
class Job < ActiveRecord::Base
has_many :activity_states
def latest_activity_state
self.activity_states.order("updated_at ASC").last # or created_at, depends
end
end
类作业
如评论中所述,主要问题是您的系统正在为每个作业创建多个ActivityState
对象。正如您所提到的,您的原始代码是这样做的:
ActivityState.create(job_id: @job.id)
问题是旧的ActivityState
仍然包含该作业的job\u id
。因此,当您执行@job.activity\u state
时,您确实看到了第一个(和旧的)活动状态,因为它是数据库中的第一个。具体来说,has_one
关系执行一个LIMIT 1
sql子句,因此从技术上讲,“第一条”记录取决于数据库对记录排序的方式(通常按输入顺序)
通常情况下,如果你要这样做,一个有一个关系
@job.activity_state = ActivityState.new(...activity state params...)
Rails试图通过将“旧”关联记录的job\u id
列重置为null来强制执行“每个记录一个关联”的概念。您的原始代码无意中绕过了该强制执行。如果您将其改为这行代码,您将允许Rails发挥其魔力,并确保与您的关联行为一致。如果您有多个与Job关联的ActivityState
,那么您的Job关联应该是has\u many:activity\u State
@Vimsha,我想这是一个很好的相关问题。DB模式看起来是一样的,不管它是有一个
还是有许多
,对吗?因此,我是否应该创建AR验证,以确保每个作业没有多个活动状态
?@mehulkar正确,DB结构将看起来相同。要回答第二个问题,很难给出明确的“是”或“否”,因为这取决于系统的设置方式。如何创建ActivityState
记录;是否有任何方法可以为同一作业
多次创建它们?如果是这样,那么我会说要么改变你的系统,使系统不能为每个作业创建多个,要么实现Vimsha的想法,并使用顺序(“created_at DESC”)
方法获取最后一个。谢谢@PaulRichter。看来有一个很容易搞糟,那么。如果没有某种验证的补充,可能会导致很多令人困惑的情况。@PaulRichter啊,很有趣。这很有帮助。我正在做ActivityState.create(job\u id:@job.id)
。分配似乎更好。谢谢你的回答。不过,我认为@PaulRichter的答案对我来说更为正确。
@job.activity_state = ActivityState.new(...activity state params...)