加入Ruby on Rails

时间:2011-04-19 19:35:57

标签: mysql ruby-on-rails ruby ruby-on-rails-3

我正在为作者制作季度版税报告。我有一个报告模型(没有数据库表支持),我用它来显示基于年份和季度的特定作者的报告。我将其路由到author/:author_id/:reports/:year/:quarter

但我正在使用它:

@line_items_totals = LineItem.where(:order_id => @orders, :product_id => @author_products).order("product_id ASC").sum(:quantity, :group => :product_id)

在给定的时间段内返回一个散列,其中产品ID为关键字,并为所有产品订单项销售的总数量,如下所示:

#<Enumerator: {1=>2865, 2=>4068, 4=>50, 5=>60, 9=>22}>

它产生的查询是:

SELECT SUM("line_items"."quantity") AS sum_quantity, product_id AS product_id 
FROM "line_items" 
WHERE ("line_items"."order_id" IN (10, 12, 15, 16)) 
AND ("line_items"."product_id" IN (2, 4, 1, 5, 9)) 
GROUP BY product_id 
ORDER BY product_id ASC

但我需要的是产品标题而不是ID。没有太多运气。我尝试使用.joins - 但由于查询中的sum方法,它似乎不起作用。

2 个答案:

答案 0 :(得分:2)

我会这样做:

ListItem.other_stuff.joins(:product).group(:product_id).select('sum(line_items.quantity) as total_quantity, products.title')

LineItem.other_stuff.group(:product_id).select('sum(quantity) as total_quantity, (select title from products where products.id == product_id) as title)')

然后您可以将title和total_quantity作为LineItem属性访问:

item.title
item.total_quantity.to_i

ActiveRecord或适配器根据所选列动态定义属性,即使表中没有此类列。另请注意,由于未知原因,MySQL适配器使用String类型创建此动态属性,而不是您期望的Fixnum(而SQLite适配器使用适当的类型)。所以你必须手动投射,就像我上面所示。

答案 1 :(得分:1)

按照以下产品标题尝试订单:

更新了代码

@line_items_totals = LineItem.where(:order_id => @orders, :product_id => @author_products).joins(:product).order("product_id ASC").group('products.title').sum(:quantity)

这应该与此相同:

@line_items_totals = LineItem.where(:order_id => @orders, :product_id => @author_products).joins(:product).order("product_id ASC").sum(:quantity, :group => 'products.title')