gpt4 book ai didi

ruby-on-rails - update_all 方法不适用于关联记录

转载 作者:行者123 更新时间:2023-11-29 12:25:12 27 4
gpt4 key购买 nike

我有两个模型,它们之间的关联是has_and_belongs_to_many。我需要重构代码,因为它会导致 n + 1 个查询。

问题: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

上一个 Controller 代码:

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

最佳答案

为什么必须创建 UserGroup 模型?这不是我们使用 habtm 关系的方式。

还有你的模型 Task,在这一切之中,让我有点困惑。你需要做什么?我怀疑您在 Task 中没有 habtm 关系。

对于您遇到的错误,这是完全可以理解的。 tasks 表中没有名为 user_group_ids 的属性(列)。而且,对于 habtm 关系,这个属性 user_group_ids 对我来说似乎拼错了。

无论如何,对于 habtm 关系,如果您的用户有很多组,并且一个组可以有很多用户,那么您走的路是正确的,但是对于 Ruby on Rails,有两种方法可以完成那个。

  1. 如果不需要管理关系表中的其他数据(关系属性):

    • 那么在您的情况下,您只需要表groups_users。 Rails 将按字母顺序查找 habtm 关系表。
  2. 如果您的 groups_users 关系包含模型的引用 ID 以外的任何其他数据,那么您最好使用 has_many :through 关系。

    • 在这种情况下,您的 UserGroup(注意奇点)表将包含您在关系中需要的额外数据。然后你声明如下:

    • User 模型将声明:has_many :groups, through: :user_groups

    • Group 模型将声明:has_many :users, through: :user_groups
    • UserGroup 模型:belongs_to :userbelongs_to :group。注意不要将其中任何一个索引为唯一、数据库或应用程序级别。

更多详情请查看http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

希望你能得到结果!

关于ruby-on-rails - update_all 方法不适用于关联记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43651554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com