2010-08-13 52 views
1

如何只加載has_many關係中的某些對象?根據條件急切加載所有has_many對象的一個​​小子集

基本上,我有四個對象:Assignment,Problem,AssignmentUserProblemUser

#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,但是之後我必須將它們匹配起來,對吧?也許這是最好的方法......但是,有關最佳實踐的任何建議,請點擊此處。

回答

0

嘗試使用:包括線沿線的東西...

#assignment.rb 
has_many :problems, :include => :problem_user 
has_many :assignment_users 

假設一個名爲在每個表的分配,問題描述字段,並problem_users解決方案應該像這樣...

Assignment.find(1).problems.collect { |a| [a.assignment.description, a.description, a.problem_user.description] }