在表关系问题中对信息进行分组和计数
我做了一个应用程序,以显示保险融资的最后一次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 %>