2015-09-01 1 views
1

У меня есть таблица, которая показывает всех клиентов и все задания для каждого клиента. Чтобы ускорить загрузку страницы, мне нужно оперативно загружать связанные задания, как показано ниже.Rails: Яркая загрузка связанных записей с внешним соединением

Однако есть две проблемы, связанные с этим подходом:

  1. Customers, которые не имеют работы, не загружаются, даже если нет joins() метод

  2. Я должен использовать медленный Ruby для сортировки заданий для каждого клиента по jobs.id.

Есть ли решение?

# http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations 
@customers = Customer.all.includes(:jobs).where(jobs: {booking_status: [2,3]}).order('users.id ASC').references(:jobs) 

@customers.each do |customer| 
    puts customer.full_name 
    jobs = customer.jobs.sort_by {|job| job.id} 
    jobs.each do |job| 
    puts job.id 
+1

Вы не получаете не -job клиентов из-за вашего предложения. Вы заявляете, что хотите, чтобы клиенты имели конкретное бронирование. Попробуйте заменить предложение where следующим: 'where (" jobs.booking_status =? OR count (jobs) =? ", [2,3], 0)' – Nathan

ответ

1

Добавить has_many клиенту

has_many :special_jobs, -> { where(booking_status: [2,3]).order(:id) }, :class_name => 'Job' 

Затем сделать

@customers = Customer.includes(:special_jobs).order(:id) 

А затем в представлении см customer.special_jobs

# this is haml 
- @customers.each do |customer| 
    %tr 
    %td= customer.name 
    %td= customer.special_jobs.map { |job| link_to(job.name, job) }.join(', ') 
+0

Работает как шарм. Малая орфографическая ошибка: 'Customer.includes' с s. – migu

+0

Исправлено это спасибо. – Swards

Смежные вопросы