1

우리는 클라이언트에 대한 통계를 계산 중입니다. 통계는 각 SpecialtyLevel에 대해 계산되며 각 통계에는 많은 오류 플래그가있을 수 있습니다 (유효성 검사 오류와 혼동해서는 안 됨). 각 Stat와 하나 개의 컬럼계산 된 열을 사용하여 조인 된 결과 매기기

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 대해 하나 개의 행을 표시 한 다음은 관계 (I은 간략화를 위해 생략 한 다음 다수의 모듈 내에 중첩되는 모든 클래스)이다 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. 결과 세트는 나에게 준다.

질문은 올바른 값을 반환하는 데 사용할 수있는 또 다른 방법이 있습니까? 아니면이 간섭이 일어나지 않도록 범위를 조정할 수있는 방법이 있습니까?

답변

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 모델의 범위뿐만 아니라 범위를 사용하는 특별한 이유가 있습니까? 당신은 단지 defSpecialtyLevel에 추가 할 수 있습니다. 단지 lengthStatFlag으로 반환하는 "가상 속성"으로 작동 할 수 있습니까?

+0

을하지만 어떻게 것이라고 나는 일종의 가상 속성에 의해? 정렬은 데이터베이스 수준에서 발생합니다. – Samo

+0

무엇이 반환되는지에 대해서는 올바른 행을 리턴합니다. 확실합니다. – Samo

관련 문제