我对如何使用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) )
但是我不知道如何将它包含在分组中并让我的视图输出正确。
答案 0 :(得分:1)
您可以在ActiveRecord关联中使用SQL接口:
has_many :ingredients, -> { group("name").select("ingredients.*", "SUM(ingredients.quantity) AS quantity") }, through: :project_items
这可能需要更多调整以使其正确,并且使用this Railscast
进行更多解释