将2列与数组相加

时间:2013-10-16 20:28:04

标签: ruby-on-rails ruby ruby-on-rails-2

各位大家好。

我想在我的视图中从不同的表中总计2列(amount_ensure和vehicle_Value)

TABLES
|POLICIES|
 |id|   |amount_ensure|

|POLICY_VEHICLES| 
 |id|   |policy_id|

|VEHICLES|
 |Id|   |vehicle_value|

这是我的控制器

def view_policy    
   @obj_policy = Policy.find(params[:id])
end

这是我的模特

class Policy < ActiveRecord::Base
  has_many :policy_vehicles
  has_many :vehicles, :through => :policy_vehicles
end

class PolicyVehicle < ActiveRecord::Base
  belongs_to :vehicle
  belongs_to :policy
end

class Vehicle < ActiveRecord::Base
  belongs_to :policy
  has_many :policy_vehicles
  has_many :policies, :through => :policy_vehicles
end

这是我的观点,在我的部分视图中@ obj_policy.vehicle为空时只显示amount_ensure但是当有值时会执行SUM(但是从我的局部视图中是一个数组)

<% if @obj_policy.vehicles.empty? %> 
  Sum:
  <%= @obj_policy.amount_ensure %>           
<% else %>
  Sum:
  <%= @obj_policy.amount_ensure + @obj_policy.vehicles.vehicle_value.to_i %>           
<% end %>

<%= render :partial=>"vehicles" %>

我的部分观点

<% @obj_policy.vehicles.each do |vehicle| %>
   <%=  vehicle.vehicle_value %>
<% end %>

我该如何解决这个问题?

我将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这应该有效

<% else %>
  Sum:
  <%= @obj_policy.amount_ensure + @obj_policy.vehicles.collect(&:vehicle_value).sum %>           
<% end %>
当车辆阵列为空时,

@obj_policy.vehicles.collect(&:vehicle_value).sum将为0

答案 1 :(得分:0)

实际上允许SQL处理它会更好。

<%= @obj_policy.amount_ensure + @obj_policy.vehicles.sum(:vehicle_value) %>

您也可以将其包装到实例方法中:

class Policy
   def total_value
     amount_ensure + vehicles.sum(:vehicle_value) # I don't remember if `to_i` is necessary here in case of empty collection, try it out
   end
end

也可以编写一个自定义SQL查询,在数据库中进行求和。在提出原始解决方案的情况下,它将获取所有可能根本不需要的字段的所有车辆。尝试尽可能多地使用SQL进行聚合作业。