使用.map函数给出了Rails App

时间:2017-04-06 00:18:55

标签: ruby-on-rails arrays ruby postgresql grouping

对于经验丰富的程序员来说,这可能很容易,但是由于我积累了经验,似乎我坚持这个......请帮助!!

我正在通过构建应用程序来学习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 %>

2 个答案:

答案 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