Rails在分片中连接错误的表



我有一个以下数据库结构,与模式克隆到2个数据库:

users(id、名称)
todos(id、标题)
todos_users(user_id todo_id)

我的软件有两个不同的客户,大公司和小公司。这些碎片代表了公司自己的任务,它们不想被分开。所有用户,包括小公司用户都存储在大公司数据库中。这是因为我们没有单独的登录,一些用户可以同时使用大公司和小公司的待办事项列表。

对于这些模型,我们有以下问题:

# ApplicationRecord connects to the current shard the user is logged to
# GlobalRecord always uses the Big company -database
class User < GlobalRecord
end
class Todo < ApplicationRecord
has_and_belongs_to_many :users
end

结果查询,例如DatabaseProxy.on_shard(shard: :small_company) do Todo.first.users end

SELECT "todos".* FROM "todos" ORDER BY "todos"."id" ASC LIMIT $1  [["LIMIT", 1]]
SELECT "users".* FROM "users" INNER JOIN "todos_users" ON "users"."id" = "todos_users"."user_id" WHERE "todos_users"."todo_id" = $1

问题在这里;它将主分片中的todos_users连接到users!这是有问题的,因为待办事项不在大公司的数据库中,而是在小公司的数据库中。因此,在选择待办事项时,我插入Small company数据库todos_users的所有信息都会丢失。

我正在使用Rails 6.1,但也可以升级到7。

通过升级到Rails 7解决(disable_joins在7中引入)并将has_and_belongs_to_many更改为:

# todos_user.rb
class TodosUser < ApplicationRecord
belongs_to :user
belongs_to :todo
end
# todo.rb
class Todo
has_many :todos_users
has_many :users, through: :todos_users, disable_joins: true
end

最新更新