我有两个模型,它们之间的关联是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