我正在使用Rails STI来建模一个复杂的领域。在视图中,我列出了以下所有子类:
> <% 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。
发布于 2013-08-14 18:38:34
在进行了一些调查之后,您关于由于延迟加载而没有出现子类的假设似乎是正确的。因为您是在开发模式下运行应用程序,所以所有类在被专门调用之前都不会加载。在生产中,您不会遇到这个问题,因为所有的东西都是一次加载并缓存的。
根据this post的说法,解决这个问题的一种方法是这样做:
[Subclass1, Subclass2, Subclass3] if Rails.env == 'development'您可以将其放在控制器的顶部,以便在加载控制器类的瞬间或在前置筛选器中加载。
发布于 2017-11-13 23:42:25
最简单的方法是开发中的eager_load!。
类似于:
<% Rails.application.eager_load! if Rails.env.development? %>
<% StateDescription.subclasses.each do |state_description| %>
<li><%= state_description.to_s %> </li>
<% end %>https://stackoverflow.com/questions/18239012
复制相似问题