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

rails:3436

From: Shinya Kawaji <kawaji@g...>
Date: Thu, 27 May 2010 20:53:08 +0900
Subject: [rails:3436] Re: 制約条件付きModelのDRY化

かわじ、です。


> ある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/

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

      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化【解決】