Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当有多个记录具有外键时,Rails有一个关联_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

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...)