我有以下資料庫結構,模式克隆到 2 個資料庫:
users(id, name)
todos(id, title)
todos_users(user_id, todo_id)
我的軟體中有 2 個不同的客戶,大公司和小公司。碎片代表公司自己的待辦事項,不想分開。所有用戶,包括小公司用戶,都存盤在大公司資料庫中。這是因為我們沒有單獨的登錄,有些用戶可以同時使用大公司和小公司的待辦事項串列。
但是,對于這些模型,我們遇到了以下問題:
# 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主分片中!這是有問題的,因為待辦事項不在大公司資料庫中,而是在小公司資料庫中。因此,todos_users在選擇待辦事項時,我插入到小型公司資料庫中的所有資訊都會丟失。
我使用的是 Rails 6.1,但也可以升級到 7。
uj5u.com熱心網友回復:
通過升級到 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/343439.html
標籤:红宝石轨道 红宝石 分片 ruby-on-rails-6.1
