我有兩個模型,它們之間的關聯是has_and_belongs_to_many
。 我需要重構代碼,因爲它會導致n + 1個查詢。update_all方法不適用於關聯記錄
問題:n + 1個查詢
1.任務
class Task < ActiveRecord::Base
has_and_belongs_to_many :user_groups
end
2.用戶組
class UserGroup < ActiveRecord::Base
has_and_belongs_to_many :tasks
end
要求:
Assign Tasks to user_groups
上控制器代碼:
task_ids.each do |task_id|
find(task_id).update_attributes! user_group_ids: params[:user_group_ids], release_date: params[:release_date]
end
我嘗試:
tasks = Task.where(id: task_ids)
tasks.update_all(user_group_ids: params[:user_group_ids], release_date: params[:release_date])
錯誤:
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column "user_group_ids" of relation "tasks" does not exist
查詢生成:
SQL (0.6ms) UPDATE "tasks" SET "user_group_ids" = 4, "release_date" = '2017-04-27 07:40:26.525357' WHERE "tasks"."deleted_at" IS NULL AND "tasks"."id" = 47394
請讓我知道如何與update_all
user_group表具有已添加的業務邏輯。由於用戶可以屬於多個組,並且組可以根據他們的權限同時進行訪問。 –
我可以通過關聯添加'has_many'。我需要將任務分配給不同的user_groups的邏輯,但是之前寫入的方式導致了「n + 1」查詢。我需要解決這個問題。 –
我可以看到,但問題是您的Task表中沒有'user_group_ids'列。你可以解決寫入遷移來添加該列,但我的感覺是,你有一個建模問題,目前還不可見 - 你的關係似乎很混亂。 – GPrimola