[英]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,有兩種方法可以實現。
如果您不需要管理關系表中的其他數據(關系屬性):
groups_users
。 Rails將按字母順序查找habtm
關系表。 如果您的groups_users
關系包含模型參考ID以外的任何其他數據,那么最好使用has_many :through
關系。
在這種情況下,您的UserGroup(請注意奇點)表將保存關系中所需的其他數據。 然后您聲明如下:
User
模型將通過以下方式聲明: has_many :groups, through: :user_groups
Group
模型將通過以下方式聲明: has_many :users, through: :user_groups
UserGroup
型號: belongs_to :user
和belongs_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.