2010-08-13 2 views
1

Как я могу загружать только некоторые объекты в отношениях 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) 

, потому что не может быть ProblemUser записей за каждые Problem, относящихся к заданию; создавая все те объекты ProblemUser, когда кто-то создает объект Problem, будет расточительным, поэтому они создаются только на лету.

То, что я хочу, чтобы иметь возможность перебрать Problems, которые принадлежат к конкретному Assignment, то для каждого Problem, найти ProblemUser, который соответствует ... но без создания N + 1 проблема. Я мог бы создать два массива, один со всеми проблемами и один со всеми проблемными пользователями, но тогда мне пришлось бы их сопоставлять, правильно? Возможно, это лучший способ ... но любые рекомендации по лучшим методам оцениваются здесь.

ответ

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] } 
Смежные вопросы