[前][次][番号順一覧][スレッド一覧]

rails:3437

From: 久野@サイベイト <hisano@s...>
Date: Fri, 28 May 2010 09:30:23 +0900
Subject: [rails:3437] Re: 制約条件付きModelのDRY化【解決】

久野です。

回答ありがとうございます。
なるほど、extendを使うのですね。
includeとextendの違いがよくわかっていませんでした。
ご紹介の記事も参考になりました。

なお、そのままだとuninitialized constantと怒られたので、
モジュールRestrictedをlib以下において、
config/environment.rb内に

require 'lib/restricted'

を追加しました。


(2010/05/27 20:53), Shinya Kawaji wrote:
> かわじ、です。
> 
> 
>> あるModelのコレクションを作成する際に、ログインユーザの権限によって
>> 制限をかけるためにwith_scopeを使って以下のような記述を行いました。
>> 現状これを複数のModelに記述しているため、DRYにしたいと考えてます。
>>
>> どこにどのように記述すべきでしょうか。
> 
> 「Moduleにして extend」ではいかがでしょうか。
> 
> module Restricted
>    def restricted
>      {} # Overwrite this method
>    end
> 
>    def find_with_privileged_scope(*args)
>      with_scope(restricted){
>        find_without_privileged_scope(*args)
>      }
>    end
> 
>    def count_with_privileged_scope(*args)
>      with_scope(restricted){
>        count_without_privileged_scope(*args)
>      }
>    end
> 
>    def self.extended(base)
>      base.class_eval{
>        class<<  self
>          alias_method_chain :find, :privileged_scope
>          alias_method_chain :count, :privileged_scope
>        end
>      }
>    end
> end
> 
> class Foo<  ActiveRecord::Base
>    extend Restricted
> 
>    def self.restricted
>      # ここに権限毎の制約条件を設定
>      {:find =>  {:conditions =>  ["owner_id = ?", User.current_user]}}
>    end
>    private_class_method :restricted
> end
> 
> 
> 何となく「extend より includeの方が良い」という場合は、
> 
>    includeする時にクラスメソッドの呼び出しと定義を行うmodule書式
>    http://d.hatena.ne.jp/zariganitosh/20080817/1219021965
> 
> という記事が、私には分かりやすいものでした。
> 
> 
> --
> ML: rails@r...
> 使い方: http://QuickML.com/
> 

--
ML: rails@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

      3435 2010-05-27 08:58 [hisano@s...         ] 制約条件付きModelのDRY化                
      3436 2010-05-27 13:53 ┗[kawaji@g...         ]                                       
->    3437 2010-05-28 02:30  ┗[hisano@s...         ] Re: 制約条件付きModelのDRY化【解決】