摘自老外的一个pg数据库schema解决方案
原帖地址:http://stackoverflow.com/questions/2782758/creating-a-multi-tenant-application-using-postgresqls-schemas-and-rails
module ActionController
module Routing
class RouteSet
def extract_request_environment(request)
env = { :method => request.method }
env[:domain] = request.domain if request.domain
env[:host] = request.host if request.host
env
end
end
class Route
alias_method :old_recognition_conditions, :recognition_conditions
def recognition_conditions
result = old_recognition_conditions
[:host, :domain].each do |key|
if conditions[key]
operator = "==="
if conditions[key].is_a?(Regexp)
operator = "=~"
end
result << "conditions[:#{key.to_s}] #{operator} env[:#{key.to_s}]"
end
end
result
end
end# end class Route
end
end
module SchemaUtils
def self.add_schema_to_path(schema)
conn = ActiveRecord::Base.connection
conn.execute "SET search_path TO #{schema}, #{conn.schema_search_path}"
end
def self.reset_search_path
conn = ActiveRecord::Base.connection
conn.execute "SET search_path TO #{conn.schema_search_path}"
end
def self.create_and_migrate_schema(schema_name)
conn = ActiveRecord::Base.connection
schemas = conn.select_values("select * from pg_namespace where nspname != 'information_schema' AND nspname NOT LIKE 'pg%'")
if schemas.include?(schema_name)
tables = conn.tables
Rails.logger.info "#{schema_name} exists already with these tables #{tables.inspect}"
else
Rails.logger.info "About to create #{schema_name}"
conn.execute "create schema #{schema_name}"
end
# Save the old search path so we can set it back at the end of this method
old_search_path = conn.schema_search_path
# Tried to set the search path like in the methods above (from Guy Naor)
# [METHOD 1]: conn.execute "SET search_path TO #{schema_name}"
# But the connection itself seems to remember the old search path.
# When Rails executes a schema it first asks if the table it will load in already exists and if :force => true.
# If both true, it will drop the table and then load it.
# The problem is that in the METHOD 1 way of setting things, ActiveRecord::Base.connection.schema_search_path still returns $user,public.
# That means that when Rails tries to load the schema, and asks if the tables exist, it searches for these tables in the public schema.
# See line 655 in Rails 2.3.5 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
# That's why I kept running into this error of the table existing when it didn't (in the newly created schema).
# If used this way [METHOD 2], it works. ActiveRecord::Base.connection.schema_search_path returns the string we pass it.
conn.schema_search_path = schema_name
# Directly from databases.rake.
# In Rails 2.3.5 databases.rake can be found in railties/lib/tasks/databases.rake
file = "#{Rails.root}/db/schema.rb"
if File.exists?(file)
Rails.logger.info "About to load the schema #{file}"
load(file)
else
abort %{#{file} doesn't exist yet. It's possible that you just ran a migration!}
end
Rails.logger.info "About to set search path back to #{old_search_path}."
conn.schema_search_path = old_search_path
end
end
分享到:
相关推荐
**示例**: 创建一个名为 `blog` 的 Rails 应用程序,并使用 PostgreSQL 数据库。 ``` rails new blog -d postgresql ``` #### 三、Rails API 文档服务器 **命令**: `gem server` - **功能**: 启动一个 WEBrick ...
By adhering to specific conventions, Rails automatically handles many aspects of application setup, such as database schema, directory structures, and file naming conventions. This approach reduces ...
你需要安装Ruby、Rails以及数据库管理系统,如SQLite或PostgreSQL。在命令行中使用`gem install rails`来安装最新版本的Rails。然后,创建一个新的Rails项目,输入`rails new myapp`,这将生成一个包含所有必需文件...
使用`rails generate apartment:schema`命令可以创建一个新的空schema,然后使用`rails apartment:migrate`来迁移所有租户。 **租户切换:** Apartment提供了`Apartment::Tenant.switch!('tenant_name')`方法来在...
在调用rake db:structure:dump时,明确定义要在Rails db/structure.sql文件中转储的PostgreSQL模式。 此功能将包含在Rails的5,但这种宝石反向移植此功能的Rails 3个Rails 4幸得为为Rails 5。 安装 将此行添加到您...
脊杆 Ridgepole 是一个管理 DB 模式的工具。 它使用定义 DB 模式,并根据 DSL 更新 DB 模式。 (如厨师/木偶) 变更日志 >= 0.4.8 activerecord-mysql-unsigned现在是可选的。 如果要使用,请在安装 --enable-...
- `-d, database=xxx`:用于指定使用的数据库类型(如mysql、oracle、postgresql、sqlite2、sqlite3等),默认为sqlite3。 - `-r, ruby-path=`:用于指定Ruby的安装路径,如果没有指定,则使用环境中的Ruby。 - `...
自述文件 该自述文件通常会记录启动和运行... rails db:schema:load Rails服务器 rails db:migrate:reset 轨道测试 Rails G迁移add_remember_digest_to_users记住_digest:字符串 Heroku日志 Heroku打开 Heroku
8. **元数据存储** - 通过`schema_plus_core`模块,将数据库模式信息存储在数据库本身,而不是Rails的`db/schema.rb`文件中,便于版本控制和团队协作。 **使用SchemaPlus** 要在Rails项目中使用`SchemaPlus`,首先...
1. **Gemfile**:定义了项目依赖的外部库或 gem,例如数据库连接器(如 activerecord-postgresql-adapter)、测试工具(如 rspec-rails)等。 2. **config/routes.rb**:定义了应用的路由规则,这些规则将 URL 映射...
风景名胜 Scenic将方法添加到ActiveRecord::Migration以在Rails中创建和管理数据库视图。 使用Scenic,可以将SQL视图的功能带到Rails... 风景秀丽的船支持PostgreSQL。 该适配器是可配置的(请参见Scenic::Configurati
5. **数据库设计**:项目可能使用SQLite或PostgreSQL等数据库,通过`db/schema.rb`文件定义数据表结构。`Post`和`Comment`模型对应的表会在这里声明,包括它们的字段和关系。 6. **测试**:Rails鼓励TDD(测试驱动...
你也需要一个数据库管理工具,如SQLite或PostgreSQL,因为Rails应用通常依赖它们来存储数据。 2. **初始化项目**: 使用`rails new ytutorial`命令创建一个新的Rails应用。这将生成应用的基本文件结构,包括控制器...
跨数据库查询在PostgreSQL中是通过创建数据库链接和使用`IMPORT FOREIGN SCHEMA`语句实现的,但这需要额外的权限和配置。 #### 46. 如何让函数返回多行或多列数据? 使用`RETURNS SETOF`或`RETURNS RECORD`声明的...
产品特点分区特定的数据库操作的迁移方法查询分区数据,创建临时分区和获取分区元数据的模型方法局限性分区表在db/schema.rb表示不正确-请使用:sql模式格式未来的工作自动分区创建(通过cron或其他方式)安装将此行...
7. **数据库**:RoR默认使用SQLite,但也可以配置为使用其他数据库如MySQL或PostgreSQL。在`db/schema.rb`文件中,可以查看数据库的结构。 8. **ActiveRecord**:RoR的ORM(Object-Relational Mapping)工具,允许...
支持关联中的跨分片引用(甚至多分片关联) 挂钩ActiveRecord查询基础结构,以自动推断正确的分片以对其执行查询,并执行必要的外键转换在同一数据库服务器上支持多个分片(使用PostgreSQL上的Schema) 主要支持...
选择器 建立一个有趣的房屋列表,并自动从Zoopla / Rightmove提取(和备份)数据。...bundle exec rails db:schema:load 发展 使用bundle exec rspec测试。 使用bundle exec rails s启动本地服务器
ActiveRecord :: PostgresEnum 将迁移和schema.rb支持添加到PostgreSQL枚举数据类型。 安装将此行添加到您的应用程序的Gemfile中: gem 'activerecord-postgres_enum' 然后执行: $ bundle或自己安装为: $ gem ...