【问题标题】:Single Table Inheritance (STI) parent ActiveRecord .subclasses .descendants returns empty单表继承 (STI) 父 ActiveRecord .subclasses .descendants 返回空
【发布时间】:2013-12-27 09:23:36
【问题描述】:

我为从一个 ActiveRecord::Base 模型继承的 10 个模型设置了 STI。

class Listing::Numeric < ActiveRecord::Base
end

class Listing::AverageDuration < Listing::Numeric
end

class Listing::TotalViews < Listing::Numeric
end

有 10 个这样的模型继承自 Listing::Numeric

在 Rails 控制台中,当我尝试 .descendants.subclasses 时,它返回一个空数组。

Listing::Numeric.descendants
=> []

Listing::Numeric.subclasses
=> []

理想情况下,这应该可以工作。

任何想法为什么它不返回预期的子类?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord single-table-inheritance ruby-2.0


    【解决方案1】:

    只有在某些运行代码中引用了所有继承的类时才有效,因为 rails 会在需要时加载类,然后只会将其添加为后代

    例如:

    Listing::Numeric.descendants.count
    => 0
    
    Listing::AverageDuration
    Listing::TotalViews
    
    Listing::Numeric.descendants.count
    => 2
    

    【讨论】:

    【解决方案2】:

    老Q,但对于像我这样对子类的空列表感到困惑的人MyClass.subclasses =&gt; []

    您需要将依赖项显式设置为 MySubclass 类。

    class MyClass < ApplicationRecord
    end
    require_dependency 'my_subclass'
    
    
    $ MyClass.subclasses
    => ['MySubclass']
    
    

    https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoloading-and-sti

    【讨论】:

      【解决方案3】:

      在调用 .descendants 方法之前执行Rails.application.eager_load!

      【讨论】:

        【解决方案4】:

        这对我有帮助

        config.autoload_paths += %W( #{config.root}/app/models/listings )

        取自这里 - http://hakunin.com/rails3-load-paths

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多