3

パフォーマンスを向上させるために、私は次のように書いています。

a = Address.joins(:vacancies).select('"addresses"."city", COUNT (*) AS total_count').group('"addresses"."city"').order('total_count DESC')

それ以外の:

a = Address.all.keep_if{ |a| a.vacancies.all_active.size > 0 }.uniq{ |a| a.city }.map{ |a| [a.city, a.vacancies.all_active.size] }.sort{ |aa, ab| aa[1] <=> ab[1] }.reverse

ただし、total_countフィールドは結果に表示されません。sqliteでクエリを実行すると、表示されます。アドレスモデルに仮想属性を追加しましたが、これは役に立ちません。これを修正する方法は?

さらに、これは私のRailsコンソールの出力です。

1.9.3p194 :010 > a = Address.joins(:vacancies).select("addresses.city, count(*) as total_count").group("addresses.city").order("total_count DESC")
  Address Load (3.9ms)  SELECT addresses.city, count(*) as total_count FROM "addresses" INNER JOIN "vacancies" ON "vacancies"."address_id" = "addresses"."id" GROUP BY addresses.city ORDER BY total_count DESC
 => [#<Address city: "Amsterdam">, #<Address city: "Rotterdam">, #<Address city: "Utrecht">, #<Address city: "Den haag">, #<Address city: "Delft">, #<Address city: "Hilversum">, #<Address city: "Amstelveen">, #<Address city: "Rijswijk">, #<Address city: "Breda">, #<Address city: "Zwolle">, #<Address city: "Tilburg">, #<Address city: "Amersfoort">, #<Address city: "Amsterdam centrum">, #<Address city: "Eindhoven">, #<Address city: "Next nature netwerk, amsterdam">, #<Address city: "Almere">, #<Address city: "Ameide">, #<Address city: "Arnhem">, #<Address city: "Baarlo">, #<Address city: "Capelle a/d ijssel">, #<Address city: "De lier">, #<Address city: "Leiden">, #<Address city: "Reigerstraat 16, breda">, #<Address city: "Rottedam">, #<Address city: "'s-hertogenbosch ">, #<Address city: "Alkmaar">, #<Address city: "Alphen aan den rijn">, #<Address city: "Amsterdam singel 137">, #<Address city: "Amsterdam, keizergracht">, #<Address city: "Barendrecht">, #<Address city: "Den haag e.o.">, #<Address city: "Deventer">, #<Address city: "Dordrecht">, #<Address city: "Groningen">, #<Address city: "Gummo, amsterdam">, #<Address city: "Hillversum">, #<Address city: "Houten">, #<Address city: "Lisse">, #<Address city: "Moti, breda">, #<Address city: "Nijmegen">, #<Address city: "Rotterdam ">, #<Address city: "Tuil (waardenburg)">, #<Address city: "Zaltbommel">] 
1.9.3p194 :011 > a.first.total_count
 => nil 
1.9.3p194 :012 > a.first.to_json
 => "{\"city\":\"Amsterdam\",\"total_count\":null}"
4

2 に答える 2

5

まず、仮想属性を削除します(attr_accessor :total_countモデルに含まれていると思います)。

Active Recordのinspectメソッド(コンソールで出力を生成するもの)は、予想される属性、つまりテーブルの実際の列に対応する属性に関する情報のみを表示するように配線されています。select句に何かを追加したためにのみ存在する属性は表示されません。彼らはまだそこにいます-あなたはすることができます

a.first.total_count

また

a.first.attributes

それを見るために。データベース属性をシャドウイングしているため、コンソールセッションでa.first.total_countは機能しません。attr_accessor

このto_json方法は、デフォルトで、認識している属性をシリアル化するという点で似ています。total_countあなたはすることによってあなたの出力に含めることができます

a.to_json(:methods => [:total_count])
于 2012-08-25T09:39:28.693 に答える
2

あなたの質問:

@result = Address.joins(:vacancies).select("addresses.city, count(*) as total_count").group("addresses.city").order("total_count DESC")

最初の要素の総数:

@result.first.total_count

コンソールにtotal_count属性が表示されない場合

@result.first.to_json

すべての属性が表示されます。

ヒント:使用している引用符が多すぎて、属性が1つのテーブルにのみ存在する場合は、属性の前にテーブル名を付ける必要はないと思います。結合によってパフォーマンスが向上することはありません。パフォーマンスを向上させたい場合は、積極的な読み込みを確認してください

于 2012-08-15T10:27:11.947 に答える