Ruby on Rails单表继承查找时,如何避免性能瓶颈问题?

2026-04-11 20:182阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计393个文字,预计阅读时间需要2分钟。

Ruby on Rails单表继承查找时,如何避免性能瓶颈问题?

我有以下三个Rails类,它们都存储在一个表中,并使用Rails的单表继承。

rubyclass Template

class ThingTemplate

class StockThingTemplate

如果有一个ID为150的StockThingTemplate,那么我应该如何查询它?

我有以下3个rails类,它们都存储在一个表中,使用rails的单表继承.

class Template < ActiveRecord::Base class ThingTemplate < Template class StockThingTemplate < ThingTemplate

如果我有一个ID为150的StockThingTemplate,那么我应该能够在逻辑上做到这一点:

ThingTemplate.find(150) => #returns me the StockThingTemplate

事实上,这有效

当它工作时,它会生成以下SQL查询:

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') OR (templates.`type` = 'StockThingTemplate' ) )

如果它不起作用,它会生成以下SQL查询:

Ruby on Rails单表继承查找时,如何避免性能瓶颈问题?

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') )

sql正在做它应该做的事情,但问题是,为什么它一次生成一组SQL,另一次生成另一组.它的字面意思完全相同.

笔记:

>我在轨道上1.2
>我已经在不同的地方尝试过’stock_thing_template’.它要么没有效果,要么引起其他问题

好.事实证明这是因为rails不会一直看到整个继承层次结构.当它在每个请求上重新加载所有项目时,这解释了不一致的行为(在某些地方,before_filter可能导致模型加载,在其他地方可能没有).

它可以通过推杆来修复

require_dependency 'stock_thing_template'

在所有引用这些东西的控制器的顶部.

More info on the rails wiki – 转到页面底部

本文共计393个文字,预计阅读时间需要2分钟。

Ruby on Rails单表继承查找时,如何避免性能瓶颈问题?

我有以下三个Rails类,它们都存储在一个表中,并使用Rails的单表继承。

rubyclass Template

class ThingTemplate

class StockThingTemplate

如果有一个ID为150的StockThingTemplate,那么我应该如何查询它?

我有以下3个rails类,它们都存储在一个表中,使用rails的单表继承.

class Template < ActiveRecord::Base class ThingTemplate < Template class StockThingTemplate < ThingTemplate

如果我有一个ID为150的StockThingTemplate,那么我应该能够在逻辑上做到这一点:

ThingTemplate.find(150) => #returns me the StockThingTemplate

事实上,这有效

当它工作时,它会生成以下SQL查询:

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') OR (templates.`type` = 'StockThingTemplate' ) )

如果它不起作用,它会生成以下SQL查询:

Ruby on Rails单表继承查找时,如何避免性能瓶颈问题?

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') )

sql正在做它应该做的事情,但问题是,为什么它一次生成一组SQL,另一次生成另一组.它的字面意思完全相同.

笔记:

>我在轨道上1.2
>我已经在不同的地方尝试过’stock_thing_template’.它要么没有效果,要么引起其他问题

好.事实证明这是因为rails不会一直看到整个继承层次结构.当它在每个请求上重新加载所有项目时,这解释了不一致的行为(在某些地方,before_filter可能导致模型加载,在其他地方可能没有).

它可以通过推杆来修复

require_dependency 'stock_thing_template'

在所有引用这些东西的控制器的顶部.

More info on the rails wiki – 转到页面底部