簡體   English   中英

update_all方法不適用於關聯記錄

[英]update_all method not working for associated records

我有兩個模型,它們之間的關聯是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

需求:

將任務分配給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:錯誤:關系“任務”的列“ user_group_ids”不存在

查詢生成:

SQL(0.6ms)UPDATE“任務” SET“ user_group_ids” = 4,“ release_date” ='2017-04-27 07:40:26.525357'WHERE“任務”。“ deleted_at”是NULL和“任務”。“ id” = 47394

請讓我知道如何使用update_all

為什么必須創建UserGroup模型? 那不是我們使用habtm關系的方式。

而您的模型Task ,在所有這些中間,讓我感到困惑。 你需要做什么? 我懷疑你沒有habtm的關系Task

對於您遇到的錯誤,這是完全可以理解的。 您在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

希望你能得到你的結果!

您的解決方案(不引起N + 1)是activerecord-import

您無法使用update_all批量分配關聯。 update_all執行一個UPDATE查詢,但是對於關聯,實際上需要一個INSERT查詢來插入關聯的模型。 您可以使用bulk_insert類的gem通過一個INSERT查詢https://github.com/jamis/bulk_insert插入所有bulk_insert對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM