1

Phusion Passenger、Nginx、および Postgres 9.1.4 で Rails 3.2 アプリを実行しています。この投稿で説明されている方法に従って、マルチテナント アプリをPostgresql のスキーマ(開発中) に移動しました。

このアプローチでは、リクエストごとにスキーマ検索パスをグローバルに (handle_subdomain を介して、以下を参照) 設定しているように見えるため、これは ( Resque を介して) バックグラウンド ジョブにどのように影響しますか?

class ApplicationController < ActionController::Base
  before_filter :handle_subdomain

  def handle_subdomain
    if @tenant = Tenant.find_by_subdomain(request.subdomain)
      PgTools.set_search_path @tenant.id
    else
      PgTools.restore_default_search_path
    end
  end
end

次に、かなりの時間がかかる Resque バックグラウンド ジョブで検索パスを設定するとどうなりますか (たとえば、S3 でホストされている多数の Paperclip 画像を削除するなど)。これは、handle_subdomain にパスを設定するアプリへのリクエストに干渉する可能性がありますか?

ActiveRecord にパッチを適用して、スキーマ検索パスをハードコーディングする必要がありますか? EG select * from "1"."users" ("1" はスキーマ パス)

助けてくれてありがとう。

4

1 に答える 1

1

ActiveRecord が "SET search_path = x" コマンドを発行するだけの場合、それはセッションごとに値を設定しているので、問題ないはずです。

実際、明示的なトランザクション内で設定すると、トランザクションがロールバックされると、トランザクションの最後にロールバックされます*。

  • araqnid からの次のコメントを明確化
于 2012-08-20T08:13:51.203 に答える