2011-07-10 3 views
0

私は学校のために構築されたレールアプリケーションを持っています。システム内のユーザーは、自分の子供の活動を追跡する親(別名、家族、またはメンバーのみ)です。教師はユーザーでもあり、ログインしてアクティビティに参加することができます。メンバーモデルは、アプリケーションが参加者を見つけるために使用する場所です。教師がメンバーモデルに追加され、同じ理由で親が追加されていることがわかります。Rails - 適切な関係モデルは何ですか

このアプリケーションに追加された教師は、各テーブルuser、user_member、およびmemberに1つのレコードを持ちます。彼がログインできるようにするユーザーのレコード、メンバーを検索して検索できるようにするレコード、user_memberの1つを使用して関連付けを行います。この場合、ユーザー自身のメンバーレコードを見つけることは簡単です。しかし、私がログインしているシステムの親と2人の子供、JamesとBrianの場合、メンバーテーブルにはJames、Brian、自分用の3つのレコードがあります。私はメンバーの記録がJamesかBrianではなく私のものであることを知る必要があります。

これをモデル化する最良の方法は何ですか?私は2つのオプションを考えました。1)userテーブルにuser自身のmember_idを指す外部キーがあります。または、2)user_membersテーブルには、このuser_idのmember_idがユーザのメンバーレコードであることを示す 'own_member'というブール値があります。それが望ましいだろうか?もう一つのレールは?そして、どのようにしてコールをビルド/関連付けを作成するのですか?

現在の関係は、このようにモデル化されています

class User < ActiveRecord::Base 
    has_many :user_members 
    has_many :members, :through => :user_members 
end 

class UserMember < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :member 
end 

class Member < ActiveRecord::Base 
    has_many :user_members 
    has_many :user, :through => :user_members 
end 

答えて

0

UserMemberがモデルに参加するようですね、ユーザーがアクセス権限を持っているメンバーについて説明します。これは、どのメンバーレコードが特定のユーザーに関連付けられているかを追跡することとは異なる概念です。ユーザーがメンバーレコードを持っているのと同じように聞こえる、とメンバーは以下のデータベース構造を意味しているユーザーに属します:

class User < ActiveRecord::Base 
    has_many :user_members 
    has_many :members, :through => :user_members 
    has_one :member 
end 

class UserMember < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :member 
end 

class Member < ActiveRecord::Base 
    has_many :user_members 
    has_many :user, :through => :user_members 
    belongs_to :user 
end 

これは「user_idの」のためにメンバー表に別のデータベース列を追加することを意味します。次のように作成し、構築することはUserインスタンスからメンバーレコードを行うことができる:ここ団体を通じて構築に関する

user = User.new 
user.build_member 
user.create_member 

さらに詳しい情報:http://ar.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

をあなたが自動的に作成時にメンバーレコードを作成するには、コールバックを作成することを検討可能性があります関連するレコードを手動で作成するのをスキップすることができます。例は次のようになります。ここでは、コールバックの

# app/models/user.rb 
class User < ActiveRecord::Base 
    before_create :build_member 

    def build_member 
    self.build_member 
    end 
end 

詳細情報:コールバックのhttp://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

良いヒント。メンバー側からの関連付けの設定に関する質問がありました。 '> me_as_member.user = me_as_user'というコンソールで次のようにして、メンバーのuser_idを設定しようとすると失敗します。 NoMethodError:未定義のメソッド 'const_defined? 'を取得します。 #のために。私は間違って何をしていますか? –

+0

私は、祖先の宝石を使用している間、スコープの予約語「親」に見えるものを使用していました。スコープ名を変更すると問題が解決しました。 –

関連する問題