在rails项目中使用两个或多个数据库

时间:2010-06-14 11:42:50

标签: ruby-on-rails ruby activerecord

我正在为不同的项目使用外部用户数据库。

现在我的项目中有学校模型,其中有很多用户,用户有很多学校。

class User < ActiveRecord::Base
  establish_connection "#{RAILS_ENV}_tunnel"
  has_many :memberships
  has_many :schools, :through => :memberships
end

class School < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :school
end

现在我遇到了什么问题:

  • 我不能打电话给school.users(因为会员表在我的PROJECT数据库中,而不在exernal USERS db中),但我可以调用user.schools
  • 我无法以这种方式更新:current_user.school.find(params [:id])。update_attributes(params [:school]),因为它以这种方式打开READ ONLY连接。

我知道如何解决这个问题,即

school.users我可以这样打电话:

class School < ActiveRecord::Base
  has_many :memberships
  # has_many :users, :through => :memberships

  def users
    User.where("users.id in (?)", self.connections.map(&:user_id))
  end
end

但这种黑客行为还不够。因为现在我无法添加school.users << User.find(203)school.users.find(params[:user_id])以及其他功能等用户,所以我们之间的关系很有用。

所以问题是如何使用两个数据库进行操作,这两个数据库通过多个关系连接到全部功能支持。

2 个答案:

答案 0 :(得分:3)

我认为在Rails中有一种方法可以完全支持这一功能 - 我认为你最好尝试使用类似MySQL's federated tables之类的东西来带遥控器DB表进入生产数据库。

答案 1 :(得分:0)

在oracle中,我将使用数据库链接。

我不完全确定,但我发现在mysql中你可以写

select * from db1.users , db2.schools where db1.users.school_id = db2.schools.id

那么你可以通过在模型中明确声明表名来在Rails中使用它:

class School
  set_table_name "db2.schools"
end

这有帮助吗?