对于经验丰富的程序员来说,这可能很容易,但是由于我积累了经验,似乎我坚持这个......请帮助!!
我正在通过构建应用程序来学习ruby on rails。
我正在使用f.select
为我的用户选择他们使用的特定类型的素材。
然后用户能够为每种材料插入一定量的重量。那部分工作正常。
然后我希望用户能够在名为“views / pages / home.html.erb”的视图中查看他使用的每种材料的公斤数
我可以在视图中显示:material_weight
的总金额,但是当我希望使用:material_weight
和{MATERIAL_TYPES
显示按.map
分类的.group
时{1}}。 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_type分类权重,但我不知道该怎么做。 任何人都可以告诉我
已编辑 @material_heavy 行
class PagesController< ApplicationController中
def home
@materials = current_user.materials
@material_heavy = current_user.materials.group(:material_type).map { |mt| mt.(['Heavy'].group.sum(:material_weight)) }
end
end
在我的material.rb
模型中,我有一段代码
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
以下是f.select
所在的输入表单
<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 %>
答案 0 :(得分:1)
这将为您提供material
=&#39;重&#39; {/ p>的material_type
个对象的集合
@current_user.materials.where(material_type: 'Heavy')
如果您不介意在模型级别进行添加:
@current_user.materials.where(material_type: 'Heavy').pluck(:material_weight).reduce(:+)
答案 1 :(得分:0)
Postgres与MySQL不同。 GROUP BY
关于它如何使您的查询变得非常严格。在我看来,你正在某个地方打破Rails惯例。我看到了一些问题,我会对它们发表评论,也许它们与你的问题有关,也许不是。
MATERIAL_TYPES = [['Heavy'], ['Medium'], ['Mild'], ['Soft']]
为什么这是一个二维列表?使用[]
时,您可以创建一个列表。您创建了一个我无法找到存在的嵌套列表。但这是你的申请所以请不要理我
请检查scopes
您要执行的操作。 http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html