我们正在为我们的客户计算统计数据。为每个 计算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 用它给我的结果集做一些非常时髦的事情。
问题是,我可以使用另一种方法来返回正确的值吗?或者有没有办法可以调整我的范围以防止这种干预发生?