【问题标题】:Single Table Inheritance with model subdirectories in Rails 3.2.11Rails 3.2.11 中带有模型子目录的单表继承
【发布时间】:2013-01-30 15:32:07
【问题描述】:

我有一个模特Sport。使用单表继承我有 2 个其他模型,CricketFootball 这样

class Cricket < Sport and class Football < Sport

我将这两个模型放在名为 sports 的模型目录中的子文件夹中。我将类型列添加到Sport 并将值设置为CricketFootball,无论是什么合适的。此外,我还能够使用Cricket.newFootball.new 创建对象。

这种结构在 Rails 3.2.6 之前都可以正常工作。

但是现在使用 Rails 3.2.11,子文件夹中的任何模型文件都必须模块化。所以,它现在看起来像这样:

module Sports
  class Cricket < Sport

现在,rails 无法单独加载 CricketFootball 类。所以,Cricket.newFootball.new 不起作用。如果我做Sports::Cricket.new,那么这对我来说是个问题,因为类型列必须是类名,即Sports::Cricket

在 Rails 3.2.11 中我应该怎么做才能使单表继承起作用?我不想将Sports::Cricket 之类的值放在我的类型列中。 另外,我不想删除子目录结构。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.2 single-table-inheritance rails-models


    【解决方案1】:

    我自己也处理过类似的问题。见How to reload files in app/models/subdirectory in dev environment for STI。基本上你需要require_dependency你的子类初始化和重新加载,在父类或配置文件中的某个地方。这是一个 Rails 延迟加载的事情,and it doesn't seem like they want to change it。我发现 Alex Reisner's post 也很有帮助。

    【讨论】:

      【解决方案2】:

      你试过用这个吗?

      config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
      

      【讨论】:

      • 是的,我已经在使用它了。但是,这只是解决了加载子文件夹的问题。它没有加载我的课程,因为该课程现在已成为 Sports::Cricket 而不仅仅是 Cricket,而且我正在使用 Cricket.new 或 Cricket.create
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多