1

ActiveRecord モデルでフィルタリングを行う必要があります。すべてのモデル オブジェクトを owner_id でフィルタリングしたいと考えています。私が必要とするのは、基本的に ActiveRecord の default_scope です。

しかし、モデルからアクセスできないセッション変数でフィルタリングする必要があります。私はいくつかの解決策を読みましたが、どれも機能しません。基本的に、default_scopeを宣言するときにセッションを使用できると言っています。

これはスコープの私の宣言です:

class MyModel < ActiveRecord::Base
    default_scope { where(:owner_id => session[:user_id]) }
    ...
end

シンプルですね。しかし、メソッド session does not exist と言って失敗します。

あなたが助けてくれることを願っています

4

3 に答える 3

3

モデルのセッション オブジェクトは悪い習慣と見なされます。代わりに、current_user に基づいてでUser設定した class 属性をクラスに追加する必要があります。around_filterApplicationController

class User < ActiveRecord::Base

    #same as below, but not thread safe
    cattr_accessible :current_id

    #OR

    #this is thread safe
    def self.current_id=(id)
      Thread.current[:client_id] = id
    end

    def self.current_id
      Thread.current[:client_id]
    end  

end

そしてあなたのApplicationControllerことで:

class ApplicationController < ActionController::Base
    around_filter :scope_current_user  

    def :scope_current_user
        User.current_id = current_user.id
    yield
    ensure
        #avoids issues when an exception is raised, to clear the current_id
        User.current_id = nil       
    end
end

そして今、あなたMyModelは次のことができます:

default_scope where( owner_id: User.current_id ) #notice you access the current_id as a class attribute
于 2013-03-07T19:45:57.560 に答える
0

セッション関連のフィルタリングは UI タスクであるため、コントローラーに配置されます。(モデル クラスは、リクエスト サイクル、セッション、Cookie などにアクセスできません)。

あなたが欲しいのは

# my_model_controller.rb
before_filter :retrieve_owner_my_models, only => [:index] # action names which need this filtered retrieval

def retrieve_owner_my_models
   @my_models ||=  MyModel.where(:owner_id => session[:user_id])
end

現在のユーザーの所有権によるフィルタリングは典型的なシナリオであるため、検索「cancan gem、accessible_by」などの標準的なソリューションの使用を検討できます。

また、default_scope の弊害にも注意してください。rails3 default_scope、および移行時のデフォルト列値

于 2012-05-21T09:40:04.333 に答える
0

これを default_scope に組み込むことはできません。セッションがないため、これにより、(たとえば) コンソール内のすべての使用が中断されます。

あなたができること: メソッドを追加して、このように ApplicationController を実行します

class ApplicationController
  ...
  def my_models
    Model.where(:owner_id => session[:user_id])
  end
  ...

  # Optional, for usage within your views:
  helper_method :my_models
end

とにかく、このメソッドはスコープを返します。

于 2012-05-21T09:35:51.217 に答える