2011-06-28 11 views
0

私のアーキテクチャは次のようになっています(簡略化されています):特定のライフサイクル(作成、レビュー、閉鎖、そのようなもの...)を経る投稿を作成する異なる権限を持つユーザーがいます。Rails:動的:finder_sqlが可能ですか?

レールで言えば、class User has_many :postsと言いますが、ユーザーには権限に応じて投稿が表示されます。ユーザーに特権が与えられている場合、彼はすべての投稿を見ることができるはずです。私は彼に、すでにレビューされた投稿と彼自身の投稿すべてを見ることを望みます。

今のところ、Postモデルにはクラスメソッドfor_user(user)があり、これは単純にユーザー特権をチェックし、それに応じた投稿を返します。私はそれがprobalbyことを行うにはRailsのウェイではありません、理解し、そしてそれはそのような何かに行うことができれば、私は思っていた:finder_sqlする:残念ながら、これはレールのように動作しない

class User 
    has_many :posts, :finder_sql => finder 
    #[...] 
    def finder 
    if self.has_privileges? #simplified... 
     all 
    else 
     where('[...]') 
    end 
    end 

を期待します文字列と文字列のみです。必要な動作を作成する他の方法はありますか?これは、ActiveRecordのがあなたのために行い、キャッシュの一部を失うという欠点を持っている

class User 
    has_many :all_posts, :class_name => "Post" 

    def posts 
     self.has_priviledges? ? self.all_posts : self.all_posts.where(...) 
    end 
end 

答えて

1

私は現在のアプリケーションで非常に似たようなことをしていますが、私はCanCan makes it very easyを使用しています。

あなたの権限ロジックをCanCanに移行するにはもう少し手間がかかるかもしれませんが、多くの柔軟性が加わります。他に何もない場合は、ソースを見て、彼がどのようにそれをするか見ることができます。

0

1つの可能な方法は、別名法「all_posts」を作成し、それを使用して自分の投稿方法を定義することです。たとえば、user.all_postsを2回呼び出した場合、最初の呼び出しではsqlが呼び出されますが、user.postsを2回呼び出すと、where句が使用されるとsqlが両方呼び出される可能性があります。

0

むしろよりhas_many(setterメソッドの束を追加するだけでなく、ゲッター)の関連付けを使用して、単純に(あなたは多かれ少なかれ、すでにやった)メソッドを定義することは:

def User < ActiveRecord::Base 

    has_many :posts # written by the user 

    # Posts the user can see 
    def posts_visible_to 
    if has_privileges? 
     Post.all 
    else 
     posts 
    end 
    end 

end 

PSます間違ってスペルの「特権」を... ...

関連する問題