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