代码之家  ›  专栏  ›  技术社区  ›  fl00r

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

  •  2
  • fl00r  · 技术社区  · 14 年前

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

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

    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(因为成员表在我的项目数据库中,而不是在外部用户数据库中),但我可以调用user.schools

    我知道我该如何解决这些问题。

    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 回复  |  直到 14 年前
        1
  •  3
  •   Codebeef    14 年前

    我不认为有一种方法可以在Rails中使用全功能支持来实现这一点-I 认为 你最好试着用 MySQL's federated tables 将远程数据库表引入生产数据库。

        2
  •  0
  •   nathanvda    14 年前

    在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
    

    有帮助吗?