ruby-on-rails – Rails与不同的数据库一起迁移
发布时间:2020-12-17 02:21:47 所属栏目:百科 来源:网络整理
导读:我需要在另一个数据库中使用Devise和现有的用户表,所以我配置了我的 database.yml: development: adapter: postgresql encoding: unicode database: almoxarifado pool: 5 timeout: 5000 username: user password: pass host: localhostusers_development:
我需要在另一个数据库中使用Devise和现有的用户表,所以我配置了我的
database.yml:
development: adapter: postgresql encoding: unicode database: almoxarifado pool: 5 timeout: 5000 username: user password: pass host: localhost users_development: adapter: postgresql encoding: unicode database: portal pool: 5 timeout: 5000 username: user password: pass host: localhost schema_search_path: users 在我的模型中,我写了这段代码: class User < ActiveRecord::Base establish_connection "users_#{Rails.env}" devise :database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable end 当我运行Rails c并调用模型类时,这个工作非常好. 迁移文件: class AddDeviseToUsers < ActiveRecord::Migration def self.up ActiveRecord::Base.establish_connection "users_#{Rails.env}" change_table(:users) do |t| ## Database authenticatable t.string :email,:null => false,:default => "" t.string :encrypted_password,: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,: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 # Uncomment below if timestamps were not included in your original model. # t.timestamps end add_index :users,:email,:unique => true add_index :users,:reset_password_token,:unique => true # add_index :users,:confirmation_token,:unlock_token,:unique => true ActiveRecord::Base.establish_connection "#{Rails.env}" end def self.down # By default,we don't want to make any assumption about how to roll back a migration when your # model already existed. Please edit below which fields you would like to remove in this migration. raise ActiveRecord::IrreversibleMigration end end 但rake db:migrate返回此错误: == AddDeviseToUsers: migrating ======================================= -- change_table(:users) rake aborted! An error has occurred,this and all later migrations canceled: undefined method `rollback' for #<ActiveRecord::ConnectionAdapters::ClosedTransaction:0xbb06767c> Tasks: TOP => db:migrate (See full trace by running task with --trace) 解决方法
由于我花了很多时间在这个和其他帖子中尝试所有替代方案,但没有成功,这里的解决方案对我有用
database.yml的 external_database: adapter: postgresql database: <%= ENV['DATABASE_NAME'] %> username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %> host: <%= ENV['DATABASE_HOST'] %> port: <%= ENV['DATABASE_PORT'] || 5432 %> 车型/ yourmodel.rb class YourModel < ActiveRecord::Base establish_connection :external_database end 你的迁移 class YourMigration < ActiveRecord::Migration def self.up YourModel.connection.enable_extension "plpgsql" YourModel.connection.create_table :your_table_name,id: :uuid do |t| t.text :title ... end end def self.down YourModel.connection.drop_table :your_table_name end end 说明:由于ActiveRecord :: Base.establish_connection关闭连接,我直接使用模型中的连接.此外,由于我使用UUID和uuid_generate_v4()方法作为默认值,我使用相同的连接启用了扩展 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |