ActiveRecord在生产中运行不同的查询?

时间:2009-04-01 00:00:57

标签: ruby-on-rails ruby activerecord environment

我的类层次结构如下所示:

class Post < ActiveRecord::Base; end
class Project < Post; end
class ProjectDesignWall < Project; end

有一个控制器可以像这样获取数据:

@projects = Project.find(:all, :include => [:project_image_photos,:user])

development中,这会直接从日志中运行以下查询:

SELECT * FROM `posts` WHERE ( (`posts`.`type` = 'Project' ) ) ORDER BY originally_created_at DESC

但是,只要它以production模式运行,即使使用相同的数据库和数据,也会产生以下查询:

SELECT * FROM `posts` WHERE ( (`posts`.`type` = 'Project' OR `posts`.`type` = 'ProjectDesignWall' ) ) ORDER BY originally_created_at DESC

有谁知道为什么会这样,有没有办法让它至少表现得一致,如果不是彻底解决问题?

2 个答案:

答案 0 :(得分:5)

因为在制作中,所有类都会立即加载。当所有类都加载时,它意识到ProjectDesignWall是Project的子类,因此收集所有类。

答案 1 :(得分:2)

这里有一个开放的票证: https://rails.lighthouseapp.com/projects/8994/tickets/188-single-table-inheritance-bug-only-in-production-environment

此解决方案的底部列出了解决方案:https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2389-sti-changes-behavior-depending-on-environment

引用:

  

您必须在中显式指定子类   父类

     

类ProjectFeedEvent&lt; FeedEvent

def self.subclasses
  [ProjectAddedEvent]
end  
     

这个问题已经存在一段时间并且没有引起太多关注的部分原因是在Rails中通常不需要STI。 Rails的大多数贡献者决定不在自己的项目中使用它,因此没有花时间确保它得到很好的支持。这里有一个简短的解释,简要解释了为什么你不应该使用它并建议一个替代方案:http://www.matthewpaulmoore.com/ruby-on-rails-code-quality-checklist#sti

我在公司使用STI的个人经历起初看起来非常有用,但随着时间的推移,我们确定我们根本不需要它来保证复杂性。从那时起,我们的项目发展迅速,我们根本没有错过它。