对于一个有经验的程序员来说,这可能是一件容易的事,但是因为我积累了经验,所以我似乎一直在坚持请帮忙!!
我正在通过构建一个应用程序来学习ruby on rails。
我使用f.select
让我的用户选择他们使用的某种类型的材料。
然后用户可以为每种材料插入一定的重量。那部分工作得很好。
然后我希望用户能够在一个名为“views/pages/home.html.erb”的视图中看到他使用的每种材料的公斤数。
我可以在视图中显示:material_weight
的总量,但是当我想使用:material_weight
和MATERIAL_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(:+)