2009-03-06 9 views
5

ここに私が達成しようとしているのは次のとおりです。ユーザーテーブルがあり、各ユーザーはアクター、ダンサー、ディレクターなどのダースタイプのいずれかになります。各タイプのユーザーは、任意の数のプロファイルを持つことができます。例えば。アクターは任意の数のactor_profilesを持つことができます。ダンサーはdancer_profilesをいくつでも持っています...Ruby on Rails多態性結合

問題はどのようにしてユーザーとプロファイルをリンクしますか?わかりやすい解決策は、各プロファイルタイプの追加テーブルを作成することです。その結果、ユーザーの多態性belongs_toを使用し、各プロファイルの単純なbelongs_toを使用することができますが、それは最適ではありません。間違いなくより良い方法は、railsにそのタイプのactorのユーザを教えることです。そうすれば、user.profilesは混乱することなく自然に動作します。レールはそのような振る舞いをサポートしていますか、あるいは前者の方法よりも優れていますか?ありがとう。

答えて

1

サブクラス内の関係を定義します。

class User < ActiveRecord::Base 
end 

class Actor < User 
    has_many :profiles, :class_name => "ActorProfile" 
end 

class Dancer < User 
    has_many :profiles, :class_name => "DancerProfile" 
end 
3

PJBの答えは、単一テーブル継承を使用しています。これを動作させるには、Typeと呼ばれるカラムをユーザとProfiles *テーブルに追加する必要があります。これにより、Railsはこれがどのタイプのユーザであるかを保存できます(Actor、DancerなどはUserのサブクラスなので)。

これは、すべてがusers/profilesテーブルに保存されることを意味しますが、インスタンス化するときにActiveRecordが正しいタイプとしてインスタンス化します。これを使えば、

User.find 

を呼び出すことができるようになりますが、また

Actor.find, Actor.all, etc 

のようなものを行うと、それはより多くの詳細と例については、Google rails single table inheritanceのみアクターに

をスコープしています。あなたのプロフィールを宣言する必要があると思います。もちろん、

  • あなたはユーザーサブクラス

クラスプロファイル<はActiveRecord ::ベース belongs_toの宣言と同じようサブクラス:ユーザー エンド

クラスActorProfileを<プロファイル エンド

クラスダンサープロファイル<プロファイル エンド

など

0

あなたがUserテーブルには、「タイプ」という列を持っていることを確認する必要があります。 RailsはそのデータベースフィールドにClass(User、Actorなど)のTYPEを保存します。

関連する問題