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 用它给我的结果集做一些非常时髦的事情。

问题是,我可以使用另一种方法来返回正确的值吗?或者有没有办法可以调整我的范围以防止这种干预发生?

4

2 回答 2

1

group句话让我怀疑。您可能想要启动调试器并单步执行代码并查看实际返回的内容。

您使用范围而不仅仅是SpecialtyLevel模型上的属性是否有特殊原因?难道你不能在上面添加一个作为“虚拟属性”的函数,它只返回defs列表的s 吗?SpecialtyLevellengthStatFlag

于 2013-08-12T14:32:55.390 回答
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)
于 2014-01-29T16:03:58.913 回答