Rails覆盖默认范围全局

时间:2017-05-25 15:29:11

标签: ruby-on-rails ruby-on-rails-3 default-scope

我有一个Rails 3.2应用程序,我想为一个客户端和一个应用程序使用一个数据库。因此,对于我创建了一个名为account_id的字段的每个模型,现在我想添加一个全局范围来过滤日志用户account_id基础中的行(account_id是一个会话参数)。所以在初始化时我创建了一个文件并放入这些代码

module ActiveRecord
  # = Active Record Named \Scopes                                                                                                                                                                                 \

  module Scoping
    module Default
      module ClassMethods

        def unscoped #:nodoc:                                                                                                                                                         
            return  (block_given? ? relation.scoping { yield } : relation).where(account_id: Thread.current['account_id'].id)

    end

        def default_scope(scope = {})
          scope = Proc.new if block_given?
          if scope.kind_of?(Array) || scope.is_a?(Hash)
              scope.merge!({:conditions=>{account_id:Thread.current['account_id'].id}})
            end
            self.default_scopes = default_scopes + [scope]
          end
        end
   end
  end
end

如果我使用用户account_id=2登录,一切正常,但如果在同一时刻我使用account_id=3登录了另一台浏览器或计算机...我有很多错误,在日志中,我有看到该应用程序同时使用account_id=2但也使用account_id=3

任何解决方案?我如何重写default_scope(scope = {})?还有其他想法吗?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我看到我可以制作

module ActiveRecord
  class  Base

    def self.build_default_scope #:nodoc:                                                                                                                                                                          
      super
      default_scopes.push({:conditions=>{:account_id=>2}})
    end
   end
 end

但我有错误未定义方法`merge'对于#