ActiveRecord query with nested models and derived column values?

守給你的承諾、 提交于 2019-12-11 20:41:30

问题


I have the following relationships:

class Order < ActiveRecord::Base
  has_many :item_selections, :dependent => :destroy
  has_many :inventory_items, :through => :item_selections
end
class InventoryItem < ActiveRecord::Base
  has_many :item_selections, :dependent => :destroy
  has_many :orders, :through => :item_selections
end
class ItemSelection < ActiveRecord::Base
  belongs_to :order
  belongs_to :inventory_item
end

I am trying to create the ActiveRecord equivalent of this SQL query below and then load the sum of the *total_weight* & *total_volume* columns into an instance variable:

select t1.quantity, t2.volume, t2.weight, 
t2.volume * t1.quantity as total_volume,    
t1.quantity * t2.weight as total_weight
from orders t0
inner join item_selections t1 on t0.id = t1.order_id
inner join inventory_items t2 on t1.inventory_item_id = t2.id
where t0.id = <id_val>     

Any idea on the right way to get these values using ActiveRecord?


回答1:


This should work:

orders = Order.select('orders.*, t1.quantity, t2.volume, t2.weight, t2.volume * t1.quantity as total_volume, t1.quantity * t2.weight as total_weight').joins('inner join item_selections t1 on orders.id = t1.order_id, inner join inventory_items t2 on t1.inventory_item_id = t2.id').where(:id => id_val)

Using a custom select like this adds the other things selected as attributes of the returned objects, so you can reference them as though they were fields of the order object:

@total_volume_sum = orders.sum(:total_volume)
@total_weight_sum = orders.sum(:total_weight)


来源:https://stackoverflow.com/questions/11279225/activerecord-query-with-nested-models-and-derived-column-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!