是否可以在Rails中跨多个数据库进行内部联接?

ard*_*vis 1 postgresql activerecord join ruby-on-rails

我很难通过has_many :through关联访问数据,其中一些表位于单独的数据库中。

# database_one
class Input < ApplicationRecord
  belongs_to :user      # Works great
end

# database_two
class User < AbstractClass
  belongs_to :group     # Works great
  has_many :inputs      # Works great
end

# database_two
class Group < AbstractClass
  has_many :users                     # Works great
  has_many :inputs, through: :users   # Does not work at all
end

class AbstractClass < ApplicationRecord
  self.abstract_class = true
  establish_connection "database_two_#{Rails.env}".to_sym
end
Run Code Online (Sandbox Code Playgroud)

因此,使用上面的代码,我可以执行以下操作:

Group.first
=> #<Group id: 1...

User.first
=> #<User id: 1...

User.first.inputs
=> #<ActiveRecord::Associations::CollectionProxy []>

Group.first.users
=> #<ActiveRecord::Associations::CollectionProxy []>
Run Code Online (Sandbox Code Playgroud)

但这不会让我执行以下操作:

Group.first.inputs
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 1: SELECT  "inputs".* FROM "inputs" INNER JOIN "users" ON "inpu...
                                                ^
: SELECT  "inputs".* FROM "inputs" INNER JOIN "users" ON "inputs"."user_id" = "users"."id" WHERE "users"."group_id" = $1 LIMIT $2
Run Code Online (Sandbox Code Playgroud)

看来不可能INNER JOIN在两个数据库之间建立跨数据库?有什么我可以减轻的方法吗?我尝试将这种方法添加到中,AbstractClass但不幸的是它并没有解决任何问题:

def self.table_name_prefix
  "database_two_#{Rails.env}."
end
Run Code Online (Sandbox Code Playgroud)

解决方法是,将以下内容添加到“组”模型中,但这不是我想要的解决方案。

def inputs
  Input.where(id: users.ids)
end
Run Code Online (Sandbox Code Playgroud)

Abh*_*ain 6

我认为不可能在一个查询中连接两个不同的表。您可能可以做的是使用Ruby获得最终收藏。通过一个查询从一个数据库获取集合,然后从另一个查询获取另一个集合。然后使用Ruby从这两个集合中进行选择/过滤。我希望这可以帮助你。