Rails Postgres 架构问题 - 以下架构之一无效:"test" "public"
Rails Postgres Schema Issue - One of the following schema(s) is invalid: "test" "public"
我四处寻找这个问题的答案,但没有找到答案。
我正在尝试使用 Rails 4、Devise 和基于 Postgres 架构的 Apartment 构建多租户应用程序。对于我的本地 Postgres 服务器,我决定使用 PostgresApp。我按照 Go Rails multi-tenant guide 进行操作,当此错误开始出现时,我的设置(每个租户一个用户)正在运行。昨天,当我尝试为 Devise 安装 Invitable 扩展时,这开始在本地显示,但我似乎找不到任何关于正在发生的事情的线索。
以下是我如何得到具体的错误:
michael$ rake environment db:drop
michael$ rake db:create
michael$ rake db:migrate
== 20160908204559 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0091s
-- add_index(:users, :email, {:unique=>true})
-> 0.0032s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0031s
-- add_index(:users, :confirmation_token, {:unique=>true})
-> 0.0032s
-- add_index(:users, :unlock_token, {:unique=>true})
-> 0.0029s
== 20160908204559 DeviseCreateUsers: migrated (0.0219s) =======================
[WARNING] - The list of tenants to migrate appears to be empty. This could mean a few things:
1. You may not have created any, in which case you can ignore this message
2. You've run `apartment:migrate` directly without loading the Rails environment
* `apartment:migrate` is now deprecated. Tenants will automatically be migrated with `db:migrate`
Note that your tenants currently haven't been migrated. You'll need to run `db:migrate` to rectify this.
michael$ rake db:seed
Seeding test tenant
One of the following schema(s) is invalid: "test" "public"
在本地访问站点时,这会导致 Rails 抛出:
Apartment::TenantNotFound
One of the following schema(s) is invalid: "www" "public"
这是我的 apartment.rb 初始值设定项:
require 'apartment/elevators/subdomain'
Apartment.configure do |config|
config.excluded_models = %w{ User }
config.tenant_names = lambda { User.pluck :subdomain }
config.use_schemas = true
end
Rails.application.config.middleware.use 'Apartment::Elevators::Subdomain'
这是我的用户迁移文件:
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
t.string :unlock_token # Only if unlock strategy is :email or :both
t.datetime :locked_at
## Invitable
#t.string :invitation_token
#t.datetime :invitation_created_at
#t.datetime :invitation_sent_at
#t.datetime :invitation_accepted_at
#t.integer :invitation_limit
#t.integer :invited_by_id
#t.string :invited_by_type
## User Info
t.string :first_name
t.string :last_name
t.string :subdomain
t.string :role
t.timestamps
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
add_index :users, :confirmation_token, unique: true
add_index :users, :unlock_token, unique: true
#add_index :users, :invitation_token, unique: true
end
end
我还通过命令行进入了本地 Postrgres 数据库。下降正在工作,创建数据库正在工作。如果需要,我可以提供这些。我目前的猜测告诉我 Rails 与 PostgresApp 的通信方式或我进行迁移的方式有问题。但也许有更多经验的人可以指出我错过的一些东西。
所以我的问题是我在做什么导致了这种情况?我该如何解决?我怎样才能更多地了解问题所在?
好的,所以我终于修好了。当我迁移时,模式之间似乎存在差异。由于某种原因,由于某种原因未更新架构。我不完全确定为什么这解决了这个问题,但我所做的是进入租户 class 文件和迁移文件(在我的例子中是 User.rb),然后注释掉除最低要求之外的所有内容设计。然后我 运行 一次一个:
rake db:drop
rake db:create
rake db:migrate
迁移时出现错误:
duplicate key value violates unique constraint "index_users_on_email"
然后我回去取消注释所有内容并重新运行 耙子并包括耙子 db:seed 这次。它奏效了!
michael$ rake db:seed
Seeding test tenant
michael$
我对抛出此错误的最佳猜测是:
- 旧的数据库模式在删除之间以某种方式持续存在
- 新的 schema.rb 文件没有更新,有一个
某种程度上的差异
不管怎样,这似乎是完美的风暴场景。如果我能重新创建它,我会 post 回来。如果这种情况发生在其他人身上,则只关注模式而不是数据库、单元或设计。那应该可以为您节省很多时间。我希望这对其他人有帮助。
公寓正在寻找子域:www.site.com。所以你必须从子域的可用名称列表中排除。
Apartment::TenantNotFound
One of the following schema(s) is invalid: "www" "public"
您需要添加到 initializers/apartment
Apartment::Elevators::Subdomain.excluded_subdomains = ['www']
a 奖金 如果你想要主域路由器
routers.rb
这将限制主要 www.site.com 或 site.com
的路由 url
class RootDomain
@subdomains = ["www"]
def self.matches?(request)
@subdomains.include?(request.subdomain) || request.subdomain.blank?
end
end
constraints(RootDomain) do
your resources for the main domain only.
end
我有类似的错误。我的问题是我有一个现有的应用程序,我试图在 Gem 上实现公寓。
我通过在 rails 控制台中追溯创建每个模式解决了这个错误,例如
Company.all.each do |c|
Apartment::Tenant.create(c.subdomain)
end
注意确保子域较低,例如'testsubdomain'
我四处寻找这个问题的答案,但没有找到答案。
我正在尝试使用 Rails 4、Devise 和基于 Postgres 架构的 Apartment 构建多租户应用程序。对于我的本地 Postgres 服务器,我决定使用 PostgresApp。我按照 Go Rails multi-tenant guide 进行操作,当此错误开始出现时,我的设置(每个租户一个用户)正在运行。昨天,当我尝试为 Devise 安装 Invitable 扩展时,这开始在本地显示,但我似乎找不到任何关于正在发生的事情的线索。
以下是我如何得到具体的错误:
michael$ rake environment db:drop
michael$ rake db:create
michael$ rake db:migrate
== 20160908204559 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0091s
-- add_index(:users, :email, {:unique=>true})
-> 0.0032s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0031s
-- add_index(:users, :confirmation_token, {:unique=>true})
-> 0.0032s
-- add_index(:users, :unlock_token, {:unique=>true})
-> 0.0029s
== 20160908204559 DeviseCreateUsers: migrated (0.0219s) =======================
[WARNING] - The list of tenants to migrate appears to be empty. This could mean a few things:
1. You may not have created any, in which case you can ignore this message
2. You've run `apartment:migrate` directly without loading the Rails environment
* `apartment:migrate` is now deprecated. Tenants will automatically be migrated with `db:migrate`
Note that your tenants currently haven't been migrated. You'll need to run `db:migrate` to rectify this.
michael$ rake db:seed
Seeding test tenant
One of the following schema(s) is invalid: "test" "public"
在本地访问站点时,这会导致 Rails 抛出:
Apartment::TenantNotFound
One of the following schema(s) is invalid: "www" "public"
这是我的 apartment.rb 初始值设定项:
require 'apartment/elevators/subdomain'
Apartment.configure do |config|
config.excluded_models = %w{ User }
config.tenant_names = lambda { User.pluck :subdomain }
config.use_schemas = true
end
Rails.application.config.middleware.use 'Apartment::Elevators::Subdomain'
这是我的用户迁移文件:
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
t.string :unlock_token # Only if unlock strategy is :email or :both
t.datetime :locked_at
## Invitable
#t.string :invitation_token
#t.datetime :invitation_created_at
#t.datetime :invitation_sent_at
#t.datetime :invitation_accepted_at
#t.integer :invitation_limit
#t.integer :invited_by_id
#t.string :invited_by_type
## User Info
t.string :first_name
t.string :last_name
t.string :subdomain
t.string :role
t.timestamps
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
add_index :users, :confirmation_token, unique: true
add_index :users, :unlock_token, unique: true
#add_index :users, :invitation_token, unique: true
end
end
我还通过命令行进入了本地 Postrgres 数据库。下降正在工作,创建数据库正在工作。如果需要,我可以提供这些。我目前的猜测告诉我 Rails 与 PostgresApp 的通信方式或我进行迁移的方式有问题。但也许有更多经验的人可以指出我错过的一些东西。
所以我的问题是我在做什么导致了这种情况?我该如何解决?我怎样才能更多地了解问题所在?
好的,所以我终于修好了。当我迁移时,模式之间似乎存在差异。由于某种原因,由于某种原因未更新架构。我不完全确定为什么这解决了这个问题,但我所做的是进入租户 class 文件和迁移文件(在我的例子中是 User.rb),然后注释掉除最低要求之外的所有内容设计。然后我 运行 一次一个:
rake db:drop
rake db:create
rake db:migrate
迁移时出现错误:
duplicate key value violates unique constraint "index_users_on_email"
然后我回去取消注释所有内容并重新运行 耙子并包括耙子 db:seed 这次。它奏效了!
michael$ rake db:seed
Seeding test tenant
michael$
我对抛出此错误的最佳猜测是:
- 旧的数据库模式在删除之间以某种方式持续存在
- 新的 schema.rb 文件没有更新,有一个 某种程度上的差异
不管怎样,这似乎是完美的风暴场景。如果我能重新创建它,我会 post 回来。如果这种情况发生在其他人身上,则只关注模式而不是数据库、单元或设计。那应该可以为您节省很多时间。我希望这对其他人有帮助。
公寓正在寻找子域:www.site.com。所以你必须从子域的可用名称列表中排除。
Apartment::TenantNotFound
One of the following schema(s) is invalid: "www" "public"
您需要添加到 initializers/apartment
Apartment::Elevators::Subdomain.excluded_subdomains = ['www']
a 奖金 如果你想要主域路由器
routers.rb
这将限制主要 www.site.com 或 site.com
的路由 urlclass RootDomain
@subdomains = ["www"]
def self.matches?(request)
@subdomains.include?(request.subdomain) || request.subdomain.blank?
end
end
constraints(RootDomain) do
your resources for the main domain only.
end
我有类似的错误。我的问题是我有一个现有的应用程序,我试图在 Gem 上实现公寓。
我通过在 rails 控制台中追溯创建每个模式解决了这个错误,例如
Company.all.each do |c|
Apartment::Tenant.create(c.subdomain)
end
注意确保子域较低,例如'testsubdomain'