如何只加載has_many關係中的某些對象?根據條件急切加載所有has_many對象的一個小子集
基本上,我有四個對象:Assignment
,Problem
,AssignmentUser
和ProblemUser
。
#assignment.rb
has_many :problems
has_many :assignment_users
#assignment_user.rb
belongs_to :assignment
belongs_to :user
has_many :problem_users
#problem.rb
belongs_to :assignment
has_many :problem_users
#problem_user.rb
belongs_to :user
belongs_to :problem
belongs_to :assignment_user
attr_accessor :complete #boolean
上顯示一個分配的頁面,我想告訴所有的問題,以及用戶的狀態對每一個問題,如果它存在。 (它可能不是,如果這是用戶第一次被查看的頁面。)
我不能叫assignment_user.problem_users
然後蛇的問題了,像這樣:
[email protected]_user.problem_users.each do |problem_user|
= check_box_tag "problems[#{problem_user.problem.id}]", 1, problem_user.complete
= link_to problem_user.problem.name, assignment_problem_path(assignment_id => problem_user.problem.assignment_id, :id => problem_user.problem_id)
,因爲可能不存在每Problem
屬於轉讓的ProblemUser
條目;只要有人創建了一個Problem
對象,創建所有這些對象將是浪費的,因此它們只是在飛行中創建的。
我想要的是能夠遍歷屬於特定Assignment
的,然後爲每個Problem
,找到相匹配的ProblemUser
...但沒有創造一個N + 1點的問題。我可以創建兩個數組,其中一個包含所有問題,另一個包含所有problem_users,但是之後我必須將它們匹配起來,對吧?也許這是最好的方法......但是,有關最佳實踐的任何建議,請點擊此處。