因ActiveRecord“type”而更新/删除错误记录

时间:2015-06-12 18:07:16

标签: ruby-on-rails ruby activerecord

我有2个表FooFooArchive,其中FooArchiveFoo的副本。 FooArchive用于存储来自Foo的旧数据,以便优化并保持第一个不会变得过大。

class Foo < ActiveRecord::Base
end

class FooArchive < ActiveRecord::Base
end

Foo是子类:

class OneFoo < Foo
end

class TwoFoo < Foo
end

当我将记录从Foo归档到FooArchive时,它还会复制其type。当我从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')]

我理解为什么它试图在另一个表中找到记录,因为该类型属于该表。

有没有办法让它在不修改数据/列的情况下工作,我正在考虑摆脱这个模型的活动记录,但还没有找到方法。

在这种情况下,我正在使用:

  • Rails 3.2.21
  • Ruby 2.1.4

1 个答案:

答案 0 :(得分:2)

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

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

注意:未经测试。您可能需要使用不存在的列而不是nil才能使其正常工作。