1

我是 Rails 的新手,我需要执行一些 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返回一个数组数组(返回的每一行都有一个内部数组)并且数组条目将是字符串。

您的查询返回单行,因此您可以使用它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.

如果您担心电话会溢出Fixnumto_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对.BignumFixnum.

如果您总是希望结果以 MB 为单位,请使用to_f(或to_dfor BigDecimal)而不是to_i,手动缩放(就像您现在所做的那样),并使用String#%它来格式化它:

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

如果您想要每个架构的大小,那么您需要调整您的table_schema = ...to 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

这将为您提供一个这样的数组数组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 回答