如何根据请求初始化Apartment时,如何找出当前的租户(架构)
我正在使用这间公寓一颗红宝石.
我在application.rb文件中添加了这个:
config.middleware.use 'Apartment::Elevators::Subdomain'
Run Code Online (Sandbox Code Playgroud)
当我尝试在浏览器url'test.domain.local:3000'中点击此内容时,PostgreSQL中不存在子域'test'架构,我看到此错误
Apartment::SchemaNotFound (One of the following schema(s) is invalid: test, "public")
Run Code Online (Sandbox Code Playgroud)
我知道这是gem的正常行为但是想要捕获这个异常并将用户重定向到其他页面,我该怎么做?
我在Rails 4中使用Apartment gem来支持Heroku上的Postgres 9.3.3中的多租户.
Apartment gem创建新租户时发生错误.
深入调查显示已创建架构,但内部没有表格.
Heroku日志显示错误:
PG::Error: ERROR:  function pg_stat_statements_reset() does not exist
Run Code Online (Sandbox Code Playgroud) ruby-on-rails-4 heroku-postgres postgresql-9.3 apartment-gem pg-stat-statements
我正在使用Apartment Gem和Postgresql 9.4.1在Rails中构建一个多租户应用程序.
我使用Minitest并且不知道RSpec.
如何设置Minitest灯具以在公共架构中放置一些灯具/数据以及在特定架构中放置一些其他数据?
示例: Accounts是我的非架构表,其余的是模式.我试图设置我的灯具前缀模式名称,如下所示:
这只是失败了:
PG::UndefinedTable: ERROR:  relation "schema1.customers" does not exist
Run Code Online (Sandbox Code Playgroud)
所以它试图将数据放入正确的模式,模式就不存在了.
看起来我需要一种方法来在迁移或首次构建测试数据库时构建租户/模式,例如:
Apartment::Tenant.create('schema1')
Run Code Online (Sandbox Code Playgroud)
然后正常的minitest预加载会将灯具数据放入适当的架构中.
不确定在何处/何时/如何发生这种情况.
有任何想法吗?
我需要在我的 Rails 应用程序中查看 SQL 和存储过程,所以我必须从 schema.rb 更改为 structure.sql。这是我的配置config/application.rb
config.active_record.schema_format = :sql
Run Code Online (Sandbox Code Playgroud)
但是当我在 seed.rb 中为实体创建新记录时
Company.create(
        name: 'Google',
        subdomain: 'google'
      )
Run Code Online (Sandbox Code Playgroud)
发生错误
my_project/db/schema.rb 还不存在
我不知道是什么问题。我是否错过了 cofig 中的某些内容,某处仍然需要 schema.rb 或者我错过了一些 rake 任务命令?我刚用
rake db:migrate db:test:prepare
Run Code Online (Sandbox Code Playgroud)
关注这个博客https://rietta.com/blog/2013/11/28/rails-and-sql-views-for-a-report/#setting-up-the-sql-view
更新:我正在使用apartment-gem并且Company实体是租户。
这里是配置 apartment.rb
Apartment.configure do |config|
  config.excluded_models = %w{ Company CommonField }
  config.tenant_names = lambda{ Company.pluck(:subdomain) }
  # ==> PostgreSQL only options
  config.use_schemas = true
  # Apartment can be forced to use raw SQL dumps instead of schema.rb for 
  # …Run Code Online (Sandbox Code Playgroud) 问题我有一个运行几百个sidekiq后台进程的rails应用程序.它们都连接到一个PostgreSQL数据库,它对提供250个连接并不十分满意 - 它可以,但如果所有sidekiq进程意外地向db发送查询,它就会崩溃.
选项1我一直在考虑在数据库前添加pgBouncer,但我目前无法使用它的事务模式,因为我高度依赖于search_path在每个作业处理的开头设置以确定哪个"国家"(PostgreSQL模式)工作(公寓宝石).在这种情况下,我将不得不使用基于会话的连接池模式.然而,据我所知,这会要求我在每次作业处理后断开连接,将连接释放回池中,这样做性能真的很高,不是吗?我错过了什么吗?
选项2使用基于应用程序层的连接池也是一个选项,但是我不确定我如何能够使用sidekiq为PostgreSQL做到这一点?
选项3我没有想到的东西?
postgresql connection-pooling pgbouncer sidekiq apartment-gem
我正在使用Apartment gem和Rails 4.1 设置多租户应用程序.
我的方法是管理界面将托管在单个域上,然后在自定义域上提供特定于租户的数据.管理用户将能够属于多个租户,并且能够在管理界面中切换租户而无需切换域.
使用Apartment,我已经能够使用会话cookie在租户之间切换而没有任何问题.这是我的代码:
class ApplicationController < ActionController::Base
  before_filter :check_tenant
  private 
  def check_tenant
    if session[:current_tenant] and Apartment::Tenant.current_tenant != session[:current_tenant]
      Apartment::Tenant.switch(session[:current_tenant])
    elsif !session[:current_tenant]
      Apartment::Tenant.switch() # Revert to the primary tenant
    end
  end
end
Run Code Online (Sandbox Code Playgroud)
我遇到的困难是,Apartment在中间件级别提供了基于域名的切换,我希望保持这种方式,因为我认为中间件比使用before_filter更快.我看到如何实现一个通用的中间件来根据请求切换租户,但我似乎无法访问和解密传递给中间件的proc中的会话存储.
由于使用会话存储似乎对管理界面有意义,您是否有任何关于在中间件级别访问会话存储的建议,或者将这两个方向放在一起的其他选择?
或者我只是担心让租户转换到中间件级别?
我目前正在使用Rails,Heroku和Apartment gem创建一个多租户应用程序.(请注意我知道在Heroku上使用多租户应用程序结构的限制超过10个不同的数据库).我正确设置了我的应用程序,并使用lvh.me让子域在本地正常工作.
自从推送到XXX-staging.herokuapp.com以来,XXX-staging已经是一个子域,所以它抛出了错误:
Apartment::TenantNotFound (One of the following schema(s) is invalid: "XXX-staging" "public"):
Run Code Online (Sandbox Code Playgroud)
有没有办法在Heroku登台环境中测试子域,或者是用另一个SSL通配符购买备用URL的唯一方法?我更愿意,如果那不是我必须做的,因为它可能是昂贵的.
我正在使用apartmentgem 进行多租户。
除了我电子邮件中的 url 之外,一切正常。因此,对于从任何请求和后台作业发送的每封电子邮件,都使用default_url_options主机。
关于如何处理电子邮件中的主机切换的任何建议?
我是 Minitest 和 Apartment 的新手,很难正确配置环境以运行测试用例。我想使用 Capybara & Selenium 进行验收测试。当我运行测试时,我收到以下错误消息:
Apartment::TenantNotFound:         Apartment::TenantNotFound: One of the following schema(s) is invalid: "test-tenant" "public"
Run Code Online (Sandbox Code Playgroud)
所以似乎没有正确创建租户。Apartment gem 有关于如何将它与 Rspec 一起使用的说明,但我不知道如何在 Minitest 中进行类似的设置。应该如何定义租户,以便 Minitest 可以看到它们?
我的 test_helpers.rb:
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
require "minitest/rails/capybara"
Minitest::Reporters.use!
class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all
end
class ActionController::TestCase
  include Devise::TestHelpers
end
class ActionDispatch::IntegrationTest
end
Run Code Online (Sandbox Code Playgroud)
和测试用例:
require "test_helper"
class LoginTest < Capybara::Rails::TestCase
  def setup
    Apartment::Tenant.drop( "test-tenant" …Run Code Online (Sandbox Code Playgroud) apartment-gem ×10
multi-tenant ×3
minitest ×2
ruby ×2
capybara ×1
fixtures ×1
heroku ×1
mysql ×1
pgbouncer ×1
postgresql ×1
selenium ×1
session ×1
sidekiq ×1