1

Railsコンソールで作業しています。2 つの異なるテーブルで同じ名前の列の SUM を選択したいと考えています。

これが私のActiveRecordコードです:

Computer.joins(:services, :repairs)
.select("computers.id, SUM(services.cost) as SCOST, SUM(repairs.cost) as RCOST")
.group("computers.id")

これはうまく機能し、次の正しい SQL を返します。

`SELECT computers.id, SUM(services.cost) as SCOST, SUM(repairs.cost) as RCOST 
FROM "computers" INNER JOIN "services" ON "services"."computer_id" = "computers"."id" 
INNER JOIN "repairs" ON "repairs"."computer_id" = "computers"."id" 
GROUP BY computers.id `

しかし、Rails コンソールに次の結果が表示されます。

=> [#<Computer id: 36>, #<Computer id: 32>]

自分の SUM 値にもアクセスできるようにすべきではありませんか? 上記の SQL クエリを postgres で実行したところ、目的の出力が得られました。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

3

Rails コンソールは、inspectメソッドを使用してオブジェクトのコンテンツを表示します。このメソッドは、カスタム フィールドの値を表示しません。明示的に参照することで、カスタム属性の値をコンソールに出力できます。

Computer.joins(:services, :repairs)
.select("computers.id, SUM(services.cost) as scost, SUM(repairs.cost) as rcost")
.group("computers.id").each do |c|
  puts c.scost
  puts c.rcost
end

編集

コメントに基づく例:

コントローラーにメンバー変数を作成します。

@computers = Computer.joins(:services, :repairs)
.select("computers.id, SUM(services.cost) as scost, SUM(repairs.cost) as rcost")
.group("computers.id")

ビューで変数を反復処理します

- @computers.each do |computer| 
  = computer.scost
  = computer.rcost

編集2

LEFT OUTER JOIN修理やサービスが不足しているコンピューターの値を取得するには、 を使用する必要があります。

join_sql = "LEFT OUTER JOIN services ON services.computer_id = computers.id
            LEFT OUTER JOIN repairs ON repairs.computer_id = computers.id"
sum_sql  = "SUM(COALESCE(services.cost, 0)) as scost, 
            SUM(COALESCE(repairs.cost, 0)) as rcost"

@computers = Computer.joins(join_sql)
.select("computers.id, #{sum_sql}")
.group("computers.id")
于 2013-03-15T07:43:55.137 に答える
0

次のようにしてみてください、

@computer_list = Computer.joins(:services, :repairs).select("computers.id, SUM(services.cost) as SCOST, SUM(repairs.cost) as RCOST").group("computers.id")
@computer_list.last.SCOST
于 2013-03-15T07:36:43.853 に答える