我的要求就像是库存管理。我必须创建一个Web应用程序,它与我们所有开发环境中的同一个表交互(现在为5个)并进行更新,删除等。
我读到了使用以下方法连接多个数据库:
class Qa1 < ActiveRecord::Base
self.abstract_class = true
establish_connection "qa1_#{Rails.env}"
end
class Qa2 < ActiveRecord::Base
self.abstract_class = true
establish_connection "qa2_#{Rails.env}"
end
现在我有一张桌子
class Table1Qa1 < Qa1
end
class Table1Qa2 < Qa2
end
class Table1Qa3 < Qa3
end
这是有效的,但我认为有更好的方式来连接而不是创建 这么多模特对同一张桌子的对象?
我正在使用Rails 3.2和ruby 1.9.3
由于
答案 0 :(得分:1)
你可以试试ar-octopus
宝石 - https://github.com/tchandy/octopus
看起来你可以这样做,
Octopus.using(:db1) do
User.create(:name => "Mike")
end
Octopus.using(:db2) do
User.create(:name => "Mike")
end
@user_db1 = User.using(:db1).find_by_name("Sam")
@user_db2 = User.using(:db2).find_by_name("Sam")
答案 1 :(得分:1)
我想要弄清楚一件重要的事情是:你真的需要这样做吗?如果你需要的只是在不同数据库之间同步一个或多个表的内容,那么编写一个定期将主表中的记录复制到其他表中的cron作业就像这样简单:
connection_params.each do |params|
ActiveRecord::Base.establish_connection(params)
sql = "INSERT INTO #{params[:table_name]} (Foo, Bar, Fizz, Buzz)
SELECT Foo, Bar, Fizz, Buzz
FROM master_qa"
#optionally WHERE ...
ActiveRecord::Base.connection.execute(sql)
end
或者,如果您必须将不同的逻辑应用于不同的环境,那么为每个表实现一个ActiveRecord模型可能不是一个坏主意。毕竟,您可以将公共逻辑保留在Ruby模块中,并将模块混合在所有模型中。
module QA
def self.order_by_foo
order("foo DESC")
end
def self.included(model_class)
# This hooks gets fired whenever the QA gets included by a class.
# You can use it to call class methods on your models. Eg:
model_class.validates :foo, :presence => true
end
end
class Qa1 < ActiveRecord::Base
include QA
establish_connection(:qa1)
end
class Qa2 < ActiveRecord::Base
include QA
establish_connection(:qa2)
end
class Qa3 < ActiveRecord::Base
include QA
establish_connection(:qa3)
end
答案 2 :(得分:0)
使用以下方法是一般模型。
调用此方法时,请在db_conf的位置传递conf名称。
def self.get_data(id,db_conf,table_name)
connection_hash = configurations[db_conf]
establish_connection connection_hash
con = connection()
sql = "SELECT *
FROM " + table_name
result = con.execute(sql)
remove_connection
establish_connection configurations["RAILS_ENV"]
result
end
<强>的database.yml 强>
db_one_conf:
adapter: mysql2
encoding: utf8
reconnect: false
database: one
pool: 8
username: root
password: bomchickuwahwah
socket: /var/run/mysqld/mysqld.sock
db_two_conf:
adapter: mysql2
encoding: utf8
reconnect: false
database: two
pool: 8
username: root
password: bomchickuwahwah
socket: /var/run/mysqld/mysqld.sock
db_three_conf:
adapter: mysql2
encoding: utf8
reconnect: false
database: three
pool: 8
username: root
password: bomchickuwahwah
socket: /var/run/mysqld/mysqld.sock
我建立与新数据库的连接并删除连接并连接回旧数据库。