0

私のアプリはサブドメインに基づいています。各マネージャーは、自分のオークションのみを表示する独自のサブドメインを持っています。私は持っている:

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

アプリがサブドメインを使用してアクセスされた場合、次のことを行う before_filter があります。

def load_manager
  @loaded_manager = Manager.find_by_subdomain(request.subdomain)
end

そして私のロットのdefault_scopeで、次のことをしたいと思います:

  default_scope {  @loaded_manager.present? ? where(deleted: false).joins(:auction => :manager).where("auctions.manager_id = ?", @loaded_manager.id) :  where(deleted: false)  }  

そのため、ウェブサイトのどこにいても、マネージャーのオークションに属するロットのみを表示します.

問題は、モデルの @loaded_manager にアクセスできないことです。これを行うための最良の方法は何ですか?

http://railscasts.com/episodes/388-multitenancy-with-scopes?view=commentsはこの問題を解決します!

4

2 に答える 2

1

フィルターの前に 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

アップデート

@Mik_Die がスレッド セーフではないことに気付いたので、スレッド セーフなソリューションについては、読者はrailscasts - multitenancy-with-scopes ( code here ) を参照してください。current_id を に保存するだけThreadです。

于 2013-04-27T20:02:18.933 に答える