13

私は現在、Rails 3 アプリケーションに取り組んでいます。このアプリケーションは、いくつかのモデルで Class Table Inheritance を使用する必要があるようです。

何が起こっているかの簡単な例はこれです。

アプリケーション内のすべてのタイプの人々に共通で、認証に使用される、名前、電子メール、パスワードなどの一般的な属性を持つ Person というクラスがあります。

Person (または 2 種類の人) には、Driver と Passenger の 2 つのサブクラスがあります。これらのサブクラスはどちらも Person の一般的な属性を共有していますが、それ自体に固有の特定の追加属性を持っています。(たとえば、ドライバーは多くの車両とライセンスを持つことができますが、乗客はそうではありません)

この種の状況で CTI を実装するにはどうすればよいですか? ここで提供される例を見てきました:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

しかし、Driver オブジェクトまたは Passenger オブジェクトから Person の共通属性にアクセスする方法については推測していないため、少し混乱しています。

特に、私が知りたいのは次のことです。

Driver の属性を更新する場合、親 people テーブルの関連する属性に簡単にアクセスして更新するにはどうすればよいですか? after_save コールバックにフックして、どの属性の更新がどこに行くのかを分離する必要がありますか? または、これにアプローチするより良い方法はありますか?

4

4 に答える 4

7

また、これを行うためのプラグイン「acts_as_relation」もあり
ます。 https://github.com/hzamani/acts_as_relation/

あなたの場合、コードは次のようになります。

class Driver < ActiveRecord::Base
   acts_as :person
end

class Passenger < ActiveRecord::Base
  acts_as :person
end

テーブルperson_typeperson_id列を追加することを忘れないでください。 Drive と Passenger の両方が Person 属性、検証、およびメソッドを継承するようになりました。persons

于 2011-06-13T03:57:54.253 に答える
5

単一テーブル継承を使用しないのはなぜですか?例えば:

class Person < ActiveRecord::Base
   # some common code here
end

class Driver < Person
   # Driver code
end

class Passenger < Person
   # Passenger code
end

このようにして、共通のクラスPersonと、それに由来する2つの特定のクラスができます。

于 2010-08-17T08:11:52.333 に答える
4

クラステーブル継承プラグインを使用していますが、うまく機能していますhttp://github.com/brunofrank/class-table-inheritance

于 2010-10-21T01:12:03.743 に答える