Ruby on rails 默认\u作用域上的访问控制器变量

Ruby on rails 默认\u作用域上的访问控制器变量,ruby-on-rails,ruby-on-rails-3,controller,scope,default-scope,Ruby On Rails,Ruby On Rails 3,Controller,Scope,Default Scope,我的应用程序基于子域。每个经理都有自己的子域,应该只显示他的拍卖。我有: class Lot < ActiveRecord::Base belongs_to :auction end class Auction < ActiveRecord::Base has_many :lots belongs_to :manager end class manager < ActiveRecord::Base has_many :auctions end 在我的标段的

我的应用程序基于子域。每个经理都有自己的子域,应该只显示他的拍卖。我有:

class Lot < ActiveRecord::Base
  belongs_to :auction
end

class Auction < ActiveRecord::Base
  has_many :lots
  belongs_to :manager
end

class manager < ActiveRecord::Base
  has_many :auctions
end
在我的标段的默认范围内,我想做以下工作:

def load_manager
  @loaded_manager = Manager.find_by_subdomain(request.subdomain)
end
  default_scope {  @loaded_manager.present? ? where(deleted: false).joins(:auction => :manager).where("auctions.manager_id = ?", @loaded_manager.id) :  where(deleted: false)  }  
因此,无论我在网站上的什么地方,我都会展示属于经理拍卖的地块

问题是我无法访问模型上的@loaded_manager。做这件事最好的方法是什么


解决这个问题

模型没有访问控制器实例变量的权限(而且不应该有-这违反了MVC原则)

在这种情况下,使用默认范围可能是个坏主意。考虑使用通常的范围,如

scope :for_manager, lambda{ |manager| manager.present? ? where(deleted: false).joins(:auction => :manager).where("auctions.manager_id = ?", manager.id) :  where(deleted: false) }
然后在你的控制器里

@lots = Lot.for_manager(@loaded_manager)

您可以将当前管理器存储在筛选前的管理器模型中:

def load_manager
  Manager.set_current(request.subdomain)
end

class Manager < ActiveRecord::Base
  cattr_accessor :current

  def self.set_current(subdomain)
    self.current = self.find_by_subdomain(subdomain)
  end
end

class Lot < ActiveRecord::Base
  default_scope { Manager.current.present? ? where(deleted: false).joins(:auction => :manager).where("auctions.manager_id = ?", Manager.current.id) : where(deleted: false) }
end
def加载管理器
Manager.set_current(request.subdomain)
结束
类管理器:Manager)。其中(“auctions.Manager\u id=?”,Manager.current.id):其中(已删除:false)}
结束
更新


正如@Mik_Die注意到的,它不是线程安全的,对于线程安全的解决方案,读者可以查看()。在这里,我们只是将当前的_id存储在
线程中

这是一种让模型知道requestsBtw的错误做法,这不是线程安全的解决方案,因为它会改变整个类的状态