2009-06-28 9 views
1

残りのリクエストに対してモデルクラスのスコープを設定する方法があるのでしょうか?私。私はいくつかの結果をスコープしたいと思っていますが、(コントローラの中に注入されたbefore_filterのような)主な安静なコントローラーを知らなくてもそれをやりたいのです。残りのリクエストのモデルのスコープを設定する

Contacts.scope = { :conditions => {:public => true} } if ladeda 

はその後

Contacts.all 

のスコープとの接触を返す必要があります。それはちょうど偽装コードですが、これが可能かどうか誰にも分かりますか?

乾杯、

Brendonの

+0

少なくとも試しましたか?それとも最初に尋ねているのですか? :) –

+0

私はそれがdoozieのように見えた後に尋ねた。私は他の何かがあまりにも多くの努力なしに提案したものを思い付くことができます:) –

答えて

1

で上書きするようにするには

Contacts.default_scope(:conditions => {:public => true}) 

を使用するためにそれを動作させるために

は、ここで私はそれを行うだろう方法は次のとおりです。

class Contact < ActiveRecord::Base 
    named_scope :public_only, :conditions => {:public => true} 
end 

class ApplicationController 
    protected 
    def contacts 
    @_contacts ||= ladeda ? Contact.public_only : Contact 
    end 
end 

class ContactsController < ApplicationController 
    def index 
    @contacts = contacts.all 
    end 
end 

私は、スコープを使用するかどうかの決定をヘルパーメソッドに移しています。コントローラで、その後

class Contact < ActiveRecord::Base 
    def self.for_index 
    ladeda ? self.public_only : self 
    end 
end 

class ContactsController < ApplicationController 
    def index 
    @contacts = Contact.for_index 
    end 
end 
+0

ありがとう、私は最後にそのようなものに行きました。私は興味のためにそれを下に掲示します。 –

0

私はスコープの方法も存在しているとは思いません。すべての後続の呼び出しが、これはあまり恐ろしくerrorprone多分周りのフィルタを使用して

Contact.default_scope(:conditions => "") 
+0

はい、これを試して、私は私のマックの開発で乗客を実行するので、私はすぐにこれのような設定の陥落を見ることができた次の呼び出しのために残る!後でそれを解除することはあなたの話です。私はそれがうまくいくことが分かったのかどうかは確かですが、一日の乗客がマルチスレッドを開始するとどうなりますか?災害のビットかもしれない:) –

0
module ContactFilterExtension 

    unloadable 

    def in_context(context) 
    if proxy_owner.context == :special_area && context != :admin 
     scoped(:conditions => {:public => true}) 
    else 
     scoped({}) 
    end 
    end 
end 

その後、

class ContactContainer < ActiveRecord::Base 

    unloadable 

    has_many :contacts, :dependent => :destroy, :order => :position, :extend => ContactFilterExtension 

end 

:簡略化されています

def index 
    @contacts = @contact_container.contacts.in_context(context) 
    end 

また、あなたはこのような、コンタクトモデル自体にヘルパーメソッドを移動することができますもちろん、それはまた、あなたはそれの後に他の範囲を連鎖させることができ、コンテキストから新しいレコードを構築することもできます。かなりきちんとしている。

コントローラには(ユーザーがシステム内にある)2つのコンテキストしかわかりませんが、もう1つはモデルだけで見つけることができるContactContainerのコンテキストです。

例として連絡先を使用したのは実際の使用例ではありません。D

関連する問題