2011-01-10 3 views
1

私のアプリケーションには、単純なアクセスレベルチェックを持つユーザーモデルがあります。このアクセスレベルは、データベース内の他のモデルへのアクセスの範囲を決定します。正確に言えば、私には地区、学校、教師、部屋と学生のモデルがあります。管理人はすべての記録を見ることができ、地区はすべての子どもの学校、教師、部屋および学生を見ることができ、教師はすべての子供の教師、部屋および学生を見ることができ、教師はすべての子供の部屋および学生を見ることができる。偽のhas_many関係を作成する - 他のメンバーに依存するものvar

これは、Userオブジェクトに1つ以上のレベルのモデルを関連付けることによって行われます。

belongs_to :district 
belongs_to :school 
belongs_to :teacher 

したがって、学校のプリンシパルは地区IDと学校IDを持ちますが、教師IDはnullになります。

子どもたちへのアクセスは、このような関数を介して制御されます。

def teachers 
    if is_admin? 
     Teacher.all 
    elsif is_district_head? 
     district.teachers 
    elsif is_principal? 
     school.teachers 
    else 
     [ teacher ] 
    end 
end 

それは私たちが同じようなものを行うことができ、昔ながらのhas_manyの関係、あたかもこのFUNCは、コード内で処理されています

current_user.teachers.find param[:teacher_id] 
current_user.teachers.each {|t| puts t.id } 

current_userが管理者であるか教師であるかを問わず、教師の正確な量が返されます。

それ以外は悲しいことです。実際のhas_many関係のみが完全に動作しますが、.findやhas_manyによって作成されたActiveRecordコレクションに固有の関数を使用しようとすると、私の偽のものは失敗します。

だから、私の質問に。明示的にhas_many関数を呼び出さずに、ActiveRecordコレクションオブジェクトを返すにはどうすればよいですか?

あなたが私が疲れていると思うなら、私は何か奇妙なことが分かりませんが、私を啓発することを躊躇しないでください!管理者レベルのユーザーアカウントから.findを使用するまで、このシステムはすばらしいと思っていました。本質的に実行していた

Teacher.all.find :conditions => 'xyz' 

...悲しいことに、教師用モデルのActiveRecordではなくEnumeratorオブジェクトを返すということです。

答えて

0

基本的に4つの役割(管理者、地区長、プリンシパル、教師(?))があります。各ユーザーにはこれらの役割の1つがあり、各役割のアクセス権限を決定する一連のルールがあります。正しい?

この問題は解決されました。 CanCanやDeclarative Authorizationなどの認証システムを検討するようお願いします。どちらも、ここで苦労している問題を簡単に処理する方法を含んでいます。学習曲線、またはコースがありますが、時間は十分に費やされます。

+0

CanCanは優れていますが、私がここにいるものにはあまり適していません。このようにモデルを編成した理由は、私がする必要があるからです。地区、学校、教師、部屋、学生の階層は、私がデータで行う必要があるために不可欠であり、ユーザモデルはどのレベル(少なくともクラス以上)にも接続できる必要があります 編集: After-thought:とにかく、ActiveRecordコレクションを偽装することが可能かどうかを知りたい。 – harbogast

関連する問題