首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails STI,子类除非使用,否则不会出现?

Rails STI,子类除非使用,否则不会出现?
EN

Stack Overflow用户
提问于 2013-08-14 18:04:00
回答 2查看 2K关注 0票数 2

我正在使用Rails STI来建模一个复杂的领域。在视图中,我列出了以下所有子类:

代码语言:javascript
运行
复制
> <% StateDescription.subclasses.each do |state_description| %>   <li>
> <%= state_description.to_s %> </li> <% end %>

为了最终使子类的每个标签都链接到单独的"index“页面,只用于该子类的实例。

这使我不必自己拥有所有可能的子类的列表(如果我添加更多的子类,可以在稍后进行更新)。

但是,我注意到只有我从数据库中实际加载的子类才会出现在列表中。如果我说StateDescription.all,那么所有现有的子类都会出现(但还没有实例)。如果我要求一个特定子类的所有,那么只有该子类出现。

我想这是我听说过的“懒惰装载”的一部分。是吗?问题似乎是,如果我不从数据库中获取特定的“类型”,即使我有它的模型,它也可能不存在吗?

有办法解决这个问题吗,还是我注定要为我创建的每个子类写一个链接?

编辑:

在控制台上,如果我键入

StateDescription.subclasses.count

我得到0。

如果我接着做StateDescription.all,然后做StateDescription.subclasses.count,我得到14。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-14 18:38:34

在进行了一些调查之后,您关于由于延迟加载而没有出现子类的假设似乎是正确的。因为您是在开发模式下运行应用程序,所以所有类在被专门调用之前都不会加载。在生产中,您不会遇到这个问题,因为所有的东西都是一次加载并缓存的。

根据this post的说法,解决这个问题的一种方法是这样做:

代码语言:javascript
运行
复制
[Subclass1, Subclass2, Subclass3] if Rails.env == 'development'

您可以将其放在控制器的顶部,以便在加载控制器类的瞬间或在前置筛选器中加载。

票数 3
EN

Stack Overflow用户

发布于 2017-11-13 23:42:25

最简单的方法是开发中的eager_load!

类似于:

代码语言:javascript
运行
复制
<% Rails.application.eager_load! if Rails.env.development? %>
<% StateDescription.subclasses.each do |state_description| %>
  <li><%= state_description.to_s %> </li>
<% end %>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18239012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档