新手问题 Rails 连接不同数据库的问题

dudu_zzzz · 2015年12月09日 · 最后由 rubyist518 回复于 2015年12月09日 · 2203 次阅读

有一个 rake 脚本,用来从 mysql 读数据,写入 postgres 里

task :whole_group => :environment do
    groups = Group.all
    created_at = DateTime.now.strftime("%Y-%m-%d %H:%M:%S")
    values = []
              ...
    conn = ActiveRecord::Base.establish_connection("PG_#{Rails.env}").connection
    conn.execute "insert into pg_group_records (group_id, data, created_at) values #{values.join(",")};"
    conn.close
end

这样的确是可以工作的,但是我写 testcase 遇到了奇怪的问题。

before 里先往 pg 里导入一些数据,然后这个 controller 从 postgres 里读一些数据做处理

before do
    Redis.new.flushall
    Rake::Task['transfer_data:whole_group'].invoke  #运行上面那个rake脚本
end
it "transfer whole group" do
    get :index
end
after do
    Minion::GroupRecord.all.each{|g| g.delete}
end
def index
  @posts = Post.... #一些查询逻辑
  @groups = Rails.cache.fetch "HOT_GROUPS_#{DateTime.now.to_i/1.days}" do
    hot_groups
  end
end

post 表存在于 mysql 中,为什么会去从 postgres 里找呢?

我觉得是 rake 脚本中 establish_connection 带来的影响,查阅了一下没有什么发现。

那么什么才是 rails 中正确的连接多个数据库的方法呢?连接之后要做怎样的处理呢?

没看出你的写法有啥问题,不过 Post.xxx 去哪儿查应该是受 database.yml 里的配置影响。

rails 中连接不同的数据库可以这么操作:

  1. 配置 database.yml yml pg_test: adapter: postgresql encoding: unicode database: pg_test pool: 5 username: root password: 2.定义一个连接此库的abstract classruby class Pg::Base < ActiveRecord::Base self.abstract_class = true self.establish_connection "pg_#{Rails.env}" end 3.连接pg的 model 直接继承就可以了 ruby class Pg::PgGroupRecord < Pg::Base end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号