Ruby on Rails中奇怪的单表继承错误

时间:2014-12-03 20:50:02

标签: ruby-on-rails ruby inheritance ruby-on-rails-4.1

我今天正在研究一个Rails应用程序(Ruby 2.1.3 / Rails 4.1),其中有几个类继承自单个类Item:

主类是Item,有一个Page类继承自继承自Page类的Item和DownloadPage类。所有对象都存储在一个表中,并由包含对象类名(类型,页面,文章,下载页等)的类型列区分。

这是UML:

UML

这里DB(Item表)中的数据是什么样的:

DB

回到问题,当应用程序加载时,我转到页面#index,所有对象类型为" Page"从Item表中列出,一切都很好,但是当应用程序至少使用一次类DownloadPage(例如:DownloadPage.first)时,页面#index会发送类型为DownloadPage的Page类型PLUS对象的每个对象,这是不正常的。 / p>

以下是该问题的演示,请注意SQL查询如何仅在第一次(步骤1)和第二次Page + DownloadPage(步骤3)时选择页面类型:

enter image description here

所以我的问题是,我做错了什么,架构可能是坏事还是其他什么?或者是一个rails / ruby​​ bug

输出:

2.1.3 :001 > Page.first

Page Load (0.9ms)  SELECT  "items".* FROM "items" WHERE "items"."type" IN ('Page')

=> #<Page id: 2, type: "Page",... 

2.1.3 :002 > DownloadPage.first

DownloadPage Load (0.6ms)  SELECT  "items".* FROM "items"  WHERE "items"."type" IN ('DownloadPage') AND "items"."deleted_at" IS NULL  ORDER BY "items"."id" ASC LIMIT 1

=> #<DownloadPage id: 26, type: "DownloadPage",...

2.1.3 :003 > Page.first

Page Load (1.8ms)  SELECT  "items".* FROM "items"  WHERE "items"."type" IN ('Page', 'DownloadPage')

=> #<Page id: 2, type: "Page", title: "sdfPage"...

1 个答案:

答案 0 :(得分:3)

class Page < Item
end

require_dependency 'download_page'

https://github.com/rails/rails/issues/8699