1

私はレールの初心者で、SQLクエリを実行して配列をビューに出力する必要がありました。

コントローラ上

@accounts = Account.all
 @itemlist = Account.find(:all,:select => 'subdomain')

 @schemasize = ActiveRecord::Base.connection.select_rows(%q{select pg_size_pretty(CAST((SELECT SUM(pg_total_relation_size(table_schema || '.' || table_name) ) FROM information_schema.tables WHERE table_schema = '}+@itemlist.map(&:subdomain).join(" ")+%q{') As bigint) )  As schema_size}).to_s.gsub(/\D/, '').to_f / 1024

コマンドで出力

  Account Load (36.0ms)  SELECT "public"."accounts".* FROM "public"."accounts"
  Account Load (2.0ms)  SELECT subdomain FROM "public"."accounts"
   (88.0ms)  select pg_size_pretty(CAST((SELECT SUM(pg_total_relation_size(table
_schema || '.' || table_name) ) FROM information_schema.tables WHERE table_schem
a = 'subdomain1 subdomain2') As bigint) ) As schema_size
  Rendered accounts/kapasitas.html.erb within layouts/admin (239.0ms)
Completed 200 OK in 2765ms (Views: 2208.1ms | ActiveRecord: 484.0ms)

html.erbで

  <tr>
    <td><%= account.subdomain %></td>
    <td><%= @schemasize %></td>
  </tr>

表示時の出力: http://i.cubeupload.com/jVrShN.png

サブドメインごとのサイズをスキーマ化することはできません。

次のような出力が必要です: http://i.cubeupload.com/PMPBYn.png

どうやってやるの?何か案が?

4

1 に答える 1

2

まず第一に、気にしないでpg_size_pretty、表示コードに書式設定を心配させてください。

次に、 がselect_rows配列の配列 (返される行ごとに 1 つの内部配列) を返し、配列エントリが文字列になることを理解する必要があります。

クエリは単一の行を返すため、その行を抽出するために使用firstし、別の行をfirstその行から単一の列を抽出するために使用できます。次にto_i、ヘルパーが理解できる数値を取得するために使用できます。

@schemasize = ActiveRecord::Base.connection.select_rows(%q{select CAST(...)})
                                           .first
                                           .first
                                           .to_i

表示するときは、次を使用しますnumber_to_human_size

<%= number_to_human_size(@schemasize) %>

の可能なオプションのリストについては、ドキュメントを参照してくださいnumber_to_human_size

Fixnum呼び出しでオーバーフローが心配な場合は、心配to_iしないでください。to_i必要に応じて次のように切り替えBignumます。

1.9.2p312 :011 > '1'.to_i.class
 => Fixnum 
1.9.2p312 :012 > '12345678910111213141516'.to_i.class
 => Bignum 

number_to_human_size同じくらい満足しBignumていFixnumます。

常に MB 単位の結果が必要な場合は、の代わりにto_f(またはto_dfor ) を使用し、(現在行っているように) 手動でスケーリングし、 を使用してフォーマットします。BigDecimalto_iString#%

<%= '%.4f' % @schemasize %>

各スキーマのサイズが必要な場合は、 に調整してtable_schema = ...から. このようなもの:table_schema in (...)GROUP BY table_schema

select table_schema, sum(pg_total_relation_size(table_schema || '.' || table_name))
from information_schema.tables
where table_schema in ('subdomain1', 'subdomain2')
group by table_schema

これにより、次のような配列の配列が得られます from select_rows

[
  [ 'subdomain1', '3284762389' ],
  [ 'subdomain2', '129837' ]
]

次に、各行を次のように展開できます。

@sizes = raw.map { |schema, size| [ schema, size.to_i ] }
# Or to_d as noted above

@sizes次に、ERB でループして、上記のようにサイズをフォーマットできます。

于 2012-12-03T04:05:32.693 に答える