gpt4 book ai didi

mysql - 使用 structure.sql 而不是 schema.rb 为 MySQL 配置公寓 gem 以创建新租户

转载 作者:行者123 更新时间:2023-12-04 11:33:17 42 4
gpt4 key购买 nike

我需要在我的 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 doesn't exist yet



我不知道是什么问题。我是否错过了 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_schemasfalse然后启用并设置 config.use_sqltrue但它仍然不起作用。也许它仅适用于 PosrtgreSQL。

那么,对 MySQL 有任何设置吗?

最佳答案

mysql2_adapter在 gem apartment扩展自 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你删除了它。
我建议两种修复方法:
  • 创建一个空文件 schema.rb ,那个。
  • 你仍然需要配置 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}

    关于mysql - 使用 structure.sql 而不是 schema.rb 为 MySQL 配置公寓 gem 以创建新租户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43838706/

    42 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com