Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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 由于ActiveRecord而更新/删除错误记录;“类型”;_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 由于ActiveRecord而更新/删除错误记录;“类型”;

Ruby on rails 由于ActiveRecord而更新/删除错误记录;“类型”;,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有两个表Foo和FooArchive,其中FooArchive是Foo的副本FooArchive用于存储Foo中的旧数据,以优化并防止第一个数据变得过大 class Foo < ActiveRecord::Base end class FooArchive < ActiveRecord::Base end 当我将记录从Foo归档到FooArchive时,它还会复制其类型。当我从FooArchive获取一条记录时,例如最后一条记录,一旦我获取该记录,如果我尝试修改它(如更新或删除

我有两个表
Foo
FooArchive
,其中
FooArchive
Foo
的副本
FooArchive
用于存储
Foo
中的旧数据,以优化并防止第一个数据变得过大

class Foo < ActiveRecord::Base
end

class FooArchive < ActiveRecord::Base
end
当我将记录从
Foo
归档到
FooArchive
时,它还会复制其
类型
。当我从
FooArchive
获取一条记录时,例如最后一条记录,一旦我获取该记录,如果我尝试修改它(如更新或删除),它将读取类型并尝试从
Foo
表而不是
FooArchive
获取该记录

foo_archive = FooArchive.last
SELECT `foo_archives`.* FROM `foo_archives` ORDER BY `foo_archives`.`id` DESC LIMIT 1

foo_archive.reload
SELECT `foos`.* FROM `foos` WHERE `foos`.`type` IN ('OneFoo') AND `foos`.`id` = 35 LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find OneFoo with id=35 [WHERE `foos`.`type` IN ('OneFoo')]
我有点理解为什么它试图在另一个表中查找记录,因为该类型属于该表

有没有一种方法可以让它在不修改数据/列的情况下工作,我正在考虑删除这个模型的活动记录,但还没有找到方法

在本例中,我使用:

  • 轨道3.2.21
  • Ruby 2.1.4

Rails假设您的
FooArchive
模型使用STI(单表继承)实例化
OneFoo
对象。您应该能够通过以下方式禁用此功能:

class FooArchive < ActiveRecord::Base
  self.inheritance_column = nil
class FooArchive

注:未经测试。您可能需要使用一个不存在的列而不是
nil
来实现此功能。

有没有任何原因表明您在复制行时没有镜像
OneFoo
twooo
并重写
type
?我对其进行了测试,它的工作原理与
classfooarchive
class FooArchive < ActiveRecord::Base
  self.inheritance_column = nil