各位大家好。
我想在我的视图中从不同的表中总计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 %>
我该如何解决这个问题?
我将非常感谢您的帮助。
答案 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进行聚合作业。