Rails has_many,分组和汇总数据

时间:2014-02-03 15:22:20

标签: ruby-on-rails postgresql ruby-on-rails-4 associations grouping

我对如何使用has_many through关系进行分组和获取数据感到困惑。我目前的模型如下所示:

class User < ActiveRecord::Base
   has_many :project_items, dependent: :destroy
   has_many :ingredients, through: :project_items
end

class Ingredient < ActiveRecord::Base
   has_many :project_items
end

class ProjectItem
   belongs_to :user
   belongs_to :ingredient
end

这允许我从我的观点中调用以下内容:

<%= render partial: "users/project_item", collection: @project_items, as: :ingredient %>

在我的控制器中将@project_items定义为:

@project_items = @user.ingredients

指向_project_item部分,该部分当前只输出名称和数量以及创建时间。

<li>
    <span class="span2"><%= ingredient.name %></span>
    <span class="span2"><%= ingredient.quantity %></span>
    <span class="span3"><%= @user.pantry_items.find_by(:ingredient_id => ingredient.id).created_at %></span>
</li>

这很好用并输出所有正确的数据。但是,数据库具有来自不同项目的相同成分的多个实例。我正在寻找以下

1。按名称分组,只列出一次相同的名称

如果我使用@user.ingredients.group_by(&:name),则不会返回任何结果。如果我使用`@ user.ingredients.group('name'),我会收到以下电话:

: SELECT "ingredients".* FROM "ingredients" INNER JOIN "project_items" ON "ingredients"."id" = "project_items"."ingredient_id" WHERE "project_items"."user_id" = $1 GROUP BY name

但是渲染时出现错误: PG ::错误:错误:列“ingredients.id”必须出现在GROUP BY子句中或用于聚合函数

2。是否可以添加和返回分组结果的列?例如我有:

Name            Quantity

Oak 2x2             2

Oak 2x2             4

返回Oak 2x2 6?

我猜它看起来像@user.ingredients.select('ingredients, sum(quantity) )但是我不知道如何将它包含在分组中并让我的视图输出正确。

1 个答案:

答案 0 :(得分:1)

您可以在ActiveRecord关联中使用SQL接口:

has_many :ingredients, -> { group("name").select("ingredients.*", "SUM(ingredients.quantity) AS quantity") }, through: :project_items

这可能需要更多调整以使其正确,并且使用this Railscast

进行更多解释