5

を照会します。RailsのSTIとマルチレベルの継承は、私は、テーブル<code>people</code>を持っている、と私はこれらのクラスで、単一テーブル継承を使用しています私のデータベースで

class Person < ActiveRecord::Base 
end 

class Member < Person 
end 

class Business < Member 
end 

Demonstration of the problem

それが混乱を生成したクエリ私。私が望むのは、Member.allがすべてのビジネスとメンバーの他のサブタイプを返すことです。それはどちらかというと、私が最近ビジネスクラスにアクセスした場合に限られます。クラスが開発モードでキャッシュされていない(明白な理由により)ためではないと思うが、それでもやはり変わったバグのように思える。

これはレールの不具合ですか?それとも意図どおりに働いていますか?どちらの場合でも、誰でも開発目的のための良い修正を考えることができますか?

+0

各クラスの継承タイプを指定してください。 –

+0

あなたは何を意味するのですか? – Obversity

答えて

1

Autoloading and Reloading Constantsにこれは意図的な行動-公式RailsのガイドがAutoloading and STIのセクションでかなりよくそれを説明する:

...

この動作を確実にする方法CTLYかかわらず 実行順序のルートクラスを定義する ファイルの一番下に手で木の葉をロードすることである。少なくとも孫であるだけ葉がロードする必要が

# app/models/polygon.rb 
class Polygon < ApplicationRecord 
end 
require_dependency 'square' 

この 方法。直接のサブクラスはプリロードする必要はありません。 の階層が深い場合、中間クラスは の下位から再帰的に自動ロードされます。定数はクラス定義 のスーパークラスとして表示されるためです。

あなたの場合、これはPersonクラスの末尾にrequire_dependency "business"を入れることを意味します。しかし

、おそらくrequire代わりのrequire_dependencyを(それがrequire_dependencyはRailsの内部方法で、変更が行わ-後にされたときにすべてのファイルを追跡し、リロードからRailsのを禁止することができるにもかかわらず)を使用することによって回避することができ、円形の依存関係の用心。

+0

これは興味深い解決策です。私は次回これが起こるときにそれを試してみよう! – Obversity

3

デフォルトでは、Railsは開発中にクラスを読み込むことを熱望していません。あなたのconfig/environments/development.rbに以下の行を変更してみてください:

# Do not eager load code on boot. 
config.eager_load = false 

へ:

# Do eager load code on boot! 
config.eager_load = true 
+0

いい考え!それは私が問題を再現するために作ったダミーのアプリで働いているようだが、私の本当のアプリ(他のものによって引き起こされる可能性がある)に私の問題のすべてを修正していない。私は後で私が適切にテストする時間があるときに受け入れられるとマークします。ありがとう! – Obversity

関連する問題