对于一个有经验的程序员来说,这可能是一件容易的事,但是因为我积累了经验,所以我似乎一直在坚持请帮忙!!
我正在通过构建一个应用程序来学习ruby on rails。
我使用f.select让我的用户选择他们使用的某种类型的材料。
然后用户可以为每种材料插入一定的重量。那部分工作得很好。
然后我希望用户能够在一个名为“views/pages/home.html.erb”的视图中看到他使用的每种材料的公斤数。
我可以在视图中显示:material_weight的总量,但是当我想使用:material_weightMATERIAL_TYPES显示按.map分类的.group时Rails返回此错误:
PG::GroupingError: ERROR: column "materials.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT "materials".* FROM "materials" WHERE "materials"."user_id" = $... ^ : SELECT "materials".* FROM "materials" WHERE "materials"."user_id" = $1 GROUP BY "materials"."material_type"
对于@material_heavy中的pages_controller.rb
我知道如何为用户选择的每种材料分类重量,但我不知道如何做到这一点。
有人能告诉我吗
编辑@material\u粗线
类PagesController

  def home
    @materials = current_user.materials
    @material_heavy = current_user.materials.group(:material_type).map { |mt| mt.(['Heavy'].group.sum(:material_weight)) }
  end
end

在我的模型中,我有tis片段
class Material < ActiveRecord::Base
  MATERIAL_TYPES = [['Heavy'], ['Medium'], ['Mild'], ['Soft']]
end

添加材料表
schema.rb的材料部分
create_table "materials", force: :cascade do |t|
 t.string   "material_type"
 t.decimal  "material_weight"
 t.decimal  "material_cost"
 t.integer  "user_id"
 t.datetime "created_at",       null: false
 t.datetime "updated_at",       null: false
 t.datetime "date"
end

以下是material.rb所在位置的输入表单
  <div class="field">
   <%= f.label :date, class: 'form-text'%>
   <%= f.date_select :date %>
  </div>
 <br />
  <div class="field">
    <%= f.label :material_type %>
    <%= f.select(:material_type, options_for_select(Material::MATERIAL_TYPES)) %>
  </div>

  <br>
  <div class="field">
   <%= f.label :material_weight %> :<%= f.number_field :material_weight, class: 'form-fields'  %> -kg.
  </div>
  <br />

  <div class="field">
    <%= f.label :material_cost %> :
    <%= f.number_field :material_cost, class: 'form-fields' %> -Kr.
  </div>

  <br>

  <div class="actions">
   <%= f.submit "Add Material" %>
  </div>
 <% end %>

最佳答案

这将为您提供一个material=“heavy”的material_type对象集合:

@current_user.materials.where(material_type: 'Heavy')

如果您不介意在模型级别进行添加:
 @current_user.materials.where(material_type: 'Heavy').pluck(:material_weight).reduce(:+)

10-07 17:57