【问题标题】:Rails has_many through, grouping and summing dataRails has_many 遍历、分组和求和数据
【发布时间】:2014-02-03 15:22:20
【问题描述】:

我对如何通过 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(&amp;: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::Error: ERROR: column "ingredients.id" 必须出现在 GROUP BY 子句中或用于聚合函数中

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

Name            Quantity

Oak 2x2             2

Oak 2x2             4

返回 Oak 2x2 6?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    这可能需要更多调整才能正确处理,this Railscast 对此进行了更多解释

    【讨论】:

    • 有没有办法把它放在一个命名的作用域中,或者把它放在控制器中?
    • 让它是动态的?
    • 是的,我并不总是希望将 user.ingredients 与总数量分组。
    • 你可以把它放到这样的范围内:scope :summed, -&gt;(var) { SQL }
    • 我将在接下来的几天里试一试,暂时让这个问题悬而未决。
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 2021-12-15
    • 2017-03-03
    • 2012-07-06
    • 2021-03-11
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多