在表关系问题中对信息进行分组和计数

我做了一个应用程序,以显示保险融资的最后一次net_insurance和计数,但我正在尝试分组并计算何时过期且未过期

在这里我的表

|policies| |id| |num_policy| 1 12345 2 54654 |insurances| |id| |id_policy| |net_insurance| 1 1 1000 2 2 2000 3 2 3000 4 1 5000 |insurance_financing| |id| |id_ensurance| |number| |expiration_date| 1 2 9888 26/10/2013 2 2 1444 27/10/2013 3 4 2444 28/10/2013 4 4 1445 01/11/2013 |trying to obtain| |num_policy| |last_net_insurance| |count_InsuranceFinancing_by_IdEnsurance| 12345 3000 2 expired 54654 5000 1 expired, 1 not expired 

这是我的控制器

 class PolicyController < ApplicationController def generate_print @policies= Policy.find(:all) end end 

这是我的模特

 class Policy < ActiveRecord::Base has_many :insurances end class Insurance < ActiveRecord::Base belongs_to :policy has_many :insurance_financing_details end class InsuranceFinancingDetail < ActiveRecord::Base belongs_to :insurance end 

这是我尝试这个时的观点

      detail.expiration_date %>        

我得到了这个结果

  |num_policy| |last_net_insurance| |count_InsuranceFinancing_by_IdEnsurance| 12345 3000 EXPIRED EXPIRED 54654 5000 EXPIRED NOT EXPIRED 

但我想要

  |num_policy| |last_net_insurance| |count_InsuranceFinancing_by_IdEnsurance| 12345 3000 2 expired 54654 5000 1 expired, 1 not expired 

我试过这个,但是计算所有,需要按到期分组

     |num_policy| |last_net_insurance| |count_InsuranceFinancing_by_IdEnsurance| 12345 3000 2 54654 5000 2 

我尝试了这段代码并没有用

     detail.expiration_date %>       

并尝试过

     detail.expiration_date %>       

但我得到了

  |num_policy| |last_net_insurance| |count_InsuranceFinancing_by_IdEnsurance| 12345 3000 3 3 54654 5000 3 3 

我该如何解决这个问题?

请有人帮我解决这个问题

谢谢

你必须重新考虑一下; 你混淆了显示逻辑和你想要执行的计算。 有些事情首先 –

  <%= "YES".size %> 

这将始终为3,原因与"NO".size将始终为2和"THISHAS19CHARACTERS".size将始终为19。

无论如何,您需要从计算中解开显示逻辑。 首先计算过期和未过期的策略,然后显示它们。 这是一个非常简单的例子:

 <% @policies.each do |p| %> <%= p.num_policy %> <% expired = 0 not_expired = 0 policy.insurances.last(1).each do |insurance| insurance.insurance_financing_details.each do |detail| if Date.today > detail.expiration_date expired += 1 else not_expired += 1 end end end %> <% if not_expired > 0 %> <%= expired %> expired, <%= not_expired %> not expired <% else %> <%= expired %> expired <% end %> <% end %> 

你可以使用Enumerable更聪明的方法缩短它们,你可以干掉显示逻辑,但我认为清晰度可能是一个好主意。

使用group_by方法可以更简单地完成此操作:

  <% policy.insurances.last(1).each do |insurance| %> <% groups = insurance.insurance_financing_details.group_by {|detail| Date.today > detail.expiration_date } %> <%= "#{groups[true].size} expired" if groups[true] %> <%= ", " if groups.size == 2 %> <%= "#{groups[false].size} not expired" if groups[false] %> <% end %> <% end %>