【问题标题】:Config apartment-gem for MySQL using structure.sql instead of schema.rb to create a new tenant使用 structure.sql 而不是 schema.rb 为 MySQL 配置 apartment-gem 以创建新租户
【发布时间】:2017-10-05 22:16:48
【问题描述】:

我需要在我的 Rails 应用程序中查看 SQL 和存储过程,因此我必须从 schema.rb 更改为 structure.sql。这是我在config/application.rb中的配置

config.active_record.schema_format = :sql

但是当我在 seed.rb 中为实体创建新记录时

Company.create(
        name: 'Google',
        subdomain: 'google'
      )

发生错误

my_project/db/schema.rb 还不存在

我不知道是什么问题。我是否错过了 cofig 中的某些内容,某个地方仍然需要 schema.rb,或者我错过了一些 rake 任务命令?我刚用过

rake db:migrate db:test:prepare

关注这个博客https://rietta.com/blog/2013/11/28/rails-and-sql-views-for-a-report/#setting-up-the-sql-view

更新: 我正在使用 apartment-gemCompany 实体是租户。

这是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 
  # creating new schemas.
  # Use this when you are using some extra features in PostgreSQL that can't 
  # be respresented in
  # schema.rb, like materialized views etc. (only applies with use_schemas set 
  # to true).
  # (Note: this option doesn't use db/structure.sql, it creates SQL dump by 
  # executing pg_dump)
  #
  # config.use_sql = false
  # <== PostgreSQL only options
  config.prepend_environment = !Rails.env.production?
end

我尝试将config.use_schemas 更改为false,然后启用并将config.use_sql 设置为true,但它仍然无法正常工作。也许它只是为 PostgreSQL 设置的。

那么,对 MySQL 有什么设置吗?

【问题讨论】:

  • 您能提供完整的错误堆栈跟踪吗?

标签: mysql ruby-on-rails ruby apartment-gem


【解决方案1】:

gem apartment 中的 mysql2_adapter 扩展自 abstract_adapter 并继承 create method 如下:

def create(tenant)
 run_callbacks :create do
  create_tenant(tenant)

  switch(tenant) do
   import_database_schema

   # Seed data if appropriate
   seed_data if Apartment.seed_after_create

   yield if block_given?
  end
 end
end

import_database_schema 方法会抛出错误:FileNotFound ... db/schema.rb doesn't exist yet 如果没有这样的文件schema.rb,所以我猜当你决定使用structure.sql 而不是schema.rb 时你删除了它。

我建议两种方法来解决:

  1. 创建一个空文件schema.rb,即它。
  2. 你仍然需要配置use_schemas,因为这表明gem apartment将使用postgresql schemasmysql use,但是 在mysql的情况下,如果你使用structure.sql,则根本不需要import_database_schema,对吧?所以你可以像下面这样创建新的 mysql 适配器:
# your-app/lib/apartment/adapters/mysql2_structure_adapter.rb
require 'apartment/adapters/mysql2_adapter'

module Apartment
  module Tenant
    def self.mysql2_adapter(config)
      if Apartment.use_schemas
        Apartment.use_sql ?
          Adapters::Mysql2StructureAdapter.new(config) :
          Adapters::Mysql2SchemaAdapter.new(config)
      else
        Adapters::Mysql2Adapter.new(config)
      end
    end
  end

  module Adapters
    class Mysql2StructureAdapter < Mysql2SchemaAdapter
      def create(tenant)
        run_callbacks :create do
          create_tenant(tenant)

          switch(tenant) do
            # no need to import schema
            # import_database_schema

            # Seed data if appropriate
            seed_data if Apartment.seed_after_create

            yield if block_given?
          end
        end
      end
    end
  end
end

然后加载该适配器,同时在初始化配置中打开use_schemasuse_sql

# config/initializers/apartment.rb
Apartment.configure do |config|
  # ...
  config.use_schemas = true
  config.use_sql = true
end
# ...
Dir[File.join(Rails.root, "lib", "apartment", "adapters", "**/*.rb")].each {|r| require r}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多