私のアプリケーションには、単純なアクセスレベルチェックを持つユーザーモデルがあります。このアクセスレベルは、データベース内の他のモデルへのアクセスの範囲を決定します。正確に言えば、私には地区、学校、教師、部屋と学生のモデルがあります。管理人はすべての記録を見ることができ、地区はすべての子どもの学校、教師、部屋および学生を見ることができ、教師はすべての子供の教師、部屋および学生を見ることができ、教師はすべての子供の部屋および学生を見ることができる。偽の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オブジェクトを返すということです。
CanCanは優れていますが、私がここにいるものにはあまり適していません。このようにモデルを編成した理由は、私がする必要があるからです。地区、学校、教師、部屋、学生の階層は、私がデータで行う必要があるために不可欠であり、ユーザモデルはどのレベル(少なくともクラス以上)にも接続できる必要があります 編集: After-thought:とにかく、ActiveRecordコレクションを偽装することが可能かどうかを知りたい。 – harbogast