2017-04-27 39 views
0

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

回答

0

做到這一點你爲什麼要創建用戶組的模式?這不是我們使用habtm關係的方式。

而你的模型Task,在這一切的中間,有點困惑我。你需要做什麼?我懷疑你在Task沒有habtm關係。

對於你遇到的錯誤,這是完全可以理解的。您在tasks表中沒有稱爲user_group_ids的屬性(列)。而且,對於habtm關係,此屬性user_group_ids似乎拼寫錯誤。

無論如何,對於一個habtm關係,如果您的用戶有很多組和一組可以有很多用戶,你在正確的道路,但是,對於Ruby on Rails的出現是你能夠做到這兩個方面。

  1. 如果您不需要管理其他數據(關係屬性)中的關係表:

    • 然後,你只需要在表groups_users,你的情況。 Rails將按字母順序查找habtm關係表。
  2. 如果您groups_users關係保持高於模型的參考ids中的任何其他數據,那麼它是更好地爲您使用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

希望你得到你的結果!

+0

user_group表具有已添加的業務邏輯。由於用戶可以屬於多個組,並且組可以根據他們的權限同時進行訪問。 –

+0

我可以通過關聯添加'has_many'。我需要將任務分配給不同的user_groups的邏輯,但是之前寫入的方式導致了「n + 1」查詢。我需要解決這個問題。 –

+0

我可以看到,但問題是您的Task表中沒有'user_group_ids'列。你可以解決寫入遷移來添加該列,但我的感覺是,你有一個建模問題,目前還不可見 - 你的關係似乎很混亂。 – GPrimola