2009-04-24 1 views
1

と現在のユーザーでは、特定の動画をディスプレイから除外します。たとえば、ホームページ上で公開されている動画のみを表示したいとします。ホームページにログインしているユーザーがいる場合は、公開されている動画を公開したいと考えています。コンテキストActiveRecordのモデルフィルタリング一般的なモデルは、のはコントローラ、アクション、リクエストパラメータに基づいなど</p> <p>パブリック/プライベート/保留、ダウンロードなどの属性の数を持っているビデオを、言わせてあります当社のサイトを通じて

また、これらのフィルタをsqlクエリだけで適用できるようにしたいので、ユーザーがサイトで検索したときに望ましくない動画を除外することができます。

これは、rails-authorization-pluginなどの承認プラグインで最も効果的ですか?結論として、私たちの目標は、プログラマが新しいアクションを追加したときに特定のビデオを誤ってフィルタリングするのを忘れるのを防ぐことです。私たちが探している解決策は非常にプログラム的でなければなりません。ここで

は私が

  1. (まだコードを書いていない)と思っています解決策は、コントローラで定義され、動画が表示され、設定を可能にするauthroizationプラグインを利用したり、当社独自のロールですまたはアクションレベル。

  2. has_many(:videos)またはhas_one(:video)のモデルの関連付け拡張を作成します。これにより、関連付けの動画の検索にオーバーロードをかけることができます。

  3. Overload Video.find同様の方法で、現在のルールに基づいて表示するものを制限します。

答えて

3

あなたの一般的な戦略は健全だと思われますが、デフォルトのファインダーを無効にしないことを強くおすすめします。

その後
class Video < ActiveRecord::Base 
    named_scope :available_to, lambda {|user| 
    if user.nil? 
     :conditions => {:public_accessible => true} 
    elsif user.omnipotent? 
     {} 
    else 
     :conditions => [%{ 
     videos.public_accessible = ? OR EXISTS (
      ....boring security stuff linking to users.... 
     ) 
     }, true, user.id] 
    end 
    } 
end 

video_shop.rb中:

class VideoShop < ActiveRecord::Base 
    has_many :videos 
end 

最後に、すべて一緒にそれを置く:これらの作業その

# All videos available to a user 
Video.available_to(user) 

# All videos in a given shop 
video_shop.videos 

# All videos in a given shop available to a given user 
video_shop.videos.available_to(user) 

ノート代わりに、ここで私が過去にやった何かユーザーがゼロであっても。

+0

これはかなりクールです。 –

関連する問題