2017-04-06 33 views
2

這對於一個經驗豐富的程序員來說可能是一件容易的事情,但是由於我正在積累經驗,所以似乎我堅持這個...請幫助!使用.map函數在Rails應用程序中給出PG :: GroupingError:ERROR:列「materials.id」

我通過構建一個應用程序學習軌道上的紅寶石。 我爲我的用戶使用f.select來選擇他們使用的某種類型的材料。 然後用戶可以爲每種材料插入一定量的重量。那部分工作正常。

然後,我希望用戶能夠看到他有多少公斤使用視圖中每個材料被稱爲「意見/頁/ home.html.erb」

我能夠顯示總的金額:material_weight在視圖中,但是當我想通過使用.map.group顯示:material_weight分類MATERIAL_TYPES。軌拋出回這個錯誤:

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"

pages_controller.rb

我一些需要如何分類的權重爲每個material_type用戶選擇@material_heavy線,但我不知道該怎麼辦那。 誰能請告訴我

EDITED@material_heavy
類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 %> 
+1

問題是'current_user.materials.group(:material_type)'將返回一個哈希,但是':material_weight'看起來並不是哈希中的一個鍵,所以'sum(:material_weight)'不起作用。 –

+1

是的,我明白,但我不確定如何查看每種材料類型的總重量? – Slowboy

+0

「材料」表的外觀如何? –

回答

1

這會給你的material_type =「重」 material對象的集合:

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

如果你不介意在模型層發生的另外:

@current_user.materials.where(material_type: 'Heavy').pluck(:material_weight).reduce(:+) 
+0

非常漂亮......像一個魅力! – Slowboy

0

Postgres的是不喜歡的MySQL。關於GROUP BY關於它想要查詢的方式非常嚴格。在我看來,你打破了Rails公約的某個地方。我看到一些問題,我會對它們發表評論,也許它們與你的問題有關,也許不是。

MATERIAL_TYPES = [['Heavy'], ['Medium'], ['Mild'], ['Soft']] 爲什麼這是一個二維列表?當你使用[]你創建一個列表。你創建了一個嵌套列表,我可以找到沒有理由存在。但它是你的應用程序,所以請忽略我

請檢查scopes您正在嘗試做什麼。http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html

相關問題