【问题标题】:ActiveRecord running different queries in production?ActiveRecord 在生产中运行不同的查询?
【发布时间】:2009-04-01 00:00:56
【问题描述】:

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

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

有谁知道为什么会发生这种情况,如果不能彻底解决问题,有没有办法让它至少表现一致?

【问题讨论】:

  • 只是为了确定,但您在两个环境中使用相同版本的 Rails 对吗?是哪个版本的?
  • 这是在同一台机器上,使用 Rails 2.3.0。

标签: ruby-on-rails ruby activerecord environment


【解决方案1】:

因为在生产环境中,您的所有类都是一次性加载的。当所有的类都在加载时,它会意识到 ProjectDesignWall 是 Project 的子类,因此会收集所有类。

【讨论】:

  • 有没有办法在开发中强制发生这种情况,而不缓存类(即不需要重新启动服务器来重新加载类)?
  • 每次重新加载时都会加载你需要的类,我想不出办法。
【解决方案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

def self.subclasses
  [ProjectAddedEvent]
end  

结束

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

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

【讨论】:

  • 这很好用,谢谢!我也一直在重新考虑 STI 的使用,但就我而言,我认为它运作良好(常见的数据结构,但子类的业务规则不同)。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多