1

Мы рассчитываем статистику для нашего клиента. Статистика рассчитывается для каждого SpecialtyLevel, и каждая статистика может иметь несколько флагов ошибок (не путать с ошибками проверки). Вот отношения (все классы ниже вложены в нескольких модулей, которые я опущенные здесь для простоты):Разбивка на разбиение на страницы с вычисленными столбцами

class SpecialtyLevel < ActiveRecord::Base 
    has_many :stats, 
     :class_name =>"Specialties::Aggregate::Stat", 
     :foreign_key => "specialty_level_id" 

    ....... 
    end 

     class Stat < Surveys::Stat 

     belongs_to :specialty_level 

     has_many :stat_flags, 
      :class_name => "Surveys::PhysicianCompensation::Stats::Specialties::Aggregate::StatFlag", 
      :foreign_key => "stat_id" 

     ...... 
     end 

     class StatFlag < Surveys::Stats::StatFlag 
     belongs_to :stat, :class_name => "Surveys::PhysicianCompensation::Stats::Specialties::Aggregate::Stat" 

     ...... 
     end 

В представлении, мы выводим одну строки для каждого SpecialtyLevel, с одной колонкой для каждого Stat и другой столбец, указывающий, имеются ли флаги ошибок для этого SpecialtyLevel. Клиент хочет иметь возможность сортировать таблицу по числу флагов ошибок. Для достижения этой цели я создал сферу в SpecialtyLevel классе:

scope :with_flag_counts, 
     select("#{self.columns_with_table_name.join(', ')}, count(stat_flags.id) as stat_flags_count"). 
     joins("INNER JOIN #{Specialties::Aggregate::Stat.table_name} stats on stats.specialty_level_id = #{self.table_name}.id 
      LEFT OUTER JOIN #{Specialties::Aggregate::StatFlag.table_name} stat_flags on stat_flags.stat_id = stats.id" 
    ). 
     group(self.columns_with_table_name.join(', ')) 

Теперь каждая строка, возвращенная из базы данных будет иметь stat_flags_count поля, которое я могу сортировать по. Это прекрасно работает, но я столкнулся с проблемой, когда я пытаюсь постраничной используя этот код:

def always_show_results_count_will_paginate objects, options = {} 
    if objects.total_entries <= objects.per_page 
     content_tag(:div, content_tag(:span, "Showing 0-#{objects.total_entries} of #{objects.total_entries}", :class => 'info-text')) 
    else 
     sc_will_paginate objects, options = {} 
    end 
    end 

По какой-то причине, objects.total_entries возвращается 1. Это, кажется, что-то в моей компетенции приводит к Rails, чтобы сделать некоторые действительно обалденный материал с результат, который он мне дает.

Вопрос в том, есть ли другой способ, который я могу использовать для возврата правильного значения? Или есть способ, которым я могу настроить свою область действия, чтобы предотвратить это вмешательство?

ответ

0

Ответ здесь, чтобы вычислить total_entries отдельно и передать в метод paginate, например:

count = SpecialtyLevel.for_participant(@participant).count 
@models = SpecialtyLevel. 
    with_flag_counts. 
    for_participant(@participant). 
    paginate(:per_page => 10, :page => page, :total_entries => count) 
1

Заявление group вызывает у меня подозрение. Возможно, вы захотите запустить отладчик и выполнить код и посмотреть, что на самом деле возвращается.

Есть ли особая причина, по которой вы используете область действия, а не только атрибут модели SpecialtyLevel? Не могли бы вы просто добавить def на SpecialtyLevel, который будет функционировать как «виртуальный атрибут», который просто возвращает length из списка StatFlag s?

+0

Но как бы я своего рода виртуальным атрибутом? Сортировка происходит на уровне базы данных. – Samo

+0

Что касается того, что возвращается, оно возвращает правильные строки, из которых я уверен. – Samo