Rails 4 - 带命名空间的STI

问题描述 投票:0回答:1

如果我有3个类如下:

class Parent < ActiveRecord::Base
end

class Child < Parent
end

class Another::Child < ::Child
end

所有这3个类都位于不同的文件夹中。

在rails控制台中,Child.first运行此查询SELECT parents.* FROM parents WHERE parents.type IN ('Child') ORDER BY parents.id ASC LIMIT 1

之后,我在rails控制台中运行Another::Child.first,并生成此查询SELECT parents.* FROM parents WHERE parents.type IN ('Another::Child') ORDER BY parents.id ASC LIMIT 1

在rails控制台中运行两个命令后,我再次运行Child.first,查询变为SELECT parents.* FROM parents WHERE parents.type IN ('Child', 'Another::Child') ORDER BY parents.id ASC LIMIT 1

这是什么原因?

考虑到Another::Child.first,每当我运行Another::Child时如何一致地调用第三个查询是Child的子类?

ruby-on-rails ruby ruby-on-rails-4 namespaces single-table-inheritance
1个回答
1
投票

您描述的行为是由Rails模型在开发模式下的延迟加载引起的(默认情况下,开发者禁用了急切加载)。在您第一次运行Another::Child.first Another::Child尚未加载之前。

您可以通过将Rails.application.config.eager_load = true添加到初始化程序文件来在所有环境中启用预先加载。

在开发中不使用预先加载的原因是因为应用程序可以(重新)加载更快。但是,当禁用eager loading时,我遇到了很多问题,特别是对于你正在使用的STI模型。它可能会变得非常令人头疼,因为开发环境的行为与生产环境不同,所以它可能会导致错误。出于这些原因,我通常建议设置eager_load = true

© www.soinside.com 2019 - 2024. All rights reserved.