Rails动态显示表数据

时间:2017-07-15 00:08:32

标签: ruby-on-rails postgresql

模型

class Smoothval < ActiveRecord::Base

has_many :smoothings
has_many :steps

end

class Step < ActiveRecord::Base
belongs_to :usdzar
belongs_to :smoothing
belongs_to :smoothval

default_scope lambda {
    order(id: :desc)
}

end

class Usdzar < ActiveRecord::Base

has_many :smoothings
has_many :steps

end

我想要实现的索引视图:

<table><thead>
<tr>
<th>Smoothing1</th>
<th>Smoothing2</th>
</tr></thead>

<tbody>
<tr>
<td>"finalsmprice","stepnum"</td>
<td>"finalsmprice","stepnum"</td>
</tr>
</tbody>
</table

因此,步骤表中每个smoothval的所有fsmprice和stepnums都是

我的index.html.erb看起来像这样:

<h1>Listing Steps</h1>
<table class="table table-striped table-bordered table-condensed">
<thead>

<% Step.all.includes(:smoothval).group_by(&:smoothval_id).each do |smoothval_id, steps| %>
<tr>
<th>
Smoothing: <%= smoothval_id %>
</th>
</tr>
</thead>

<tbody>
<% steps.each do |step| %>
 <tr>
 <td>
 (<%= step.fsmprice %>): <%= step.stepnum %>
  </td>


  <% end %>
 </tr> </tbody>
<% end %>

</table>

表格非常长,显然会显示所有标题和数据。我试图创建一个postgres数据透视表,但是使用tablefunc失败了,所以回来尝试在rails中执行它

在我的控制器中,我可以将smoothval(表格标题)放入一个数组中,如下所示,数组看起来像[1,5]:

sv = Smoothval.where('id IN (SELECT DISTINCT(steps.smoothval_id) FROM steps)')
@assigned = sv.pluck(:id)     

如何获得上面的表格布局

由于

1 个答案:

答案 0 :(得分:0)

这太难了,并且发表了一篇文章,表示最好创建一个数据透视表 尽管在Postgres中这并不容易,但tablefunc扩展的问题在于它不会动态分配列,因此需要静态分配它们。所以我现在就走这条路,并测试了函数https://github.com/hnsl/colpivot

我坚持使用基础知识并做到了这一点,但需要更多地考虑重构解决方案。

SELECT c_crosstab('Select * from steps', 'ct_view', 'id', 'smoothval_id', 'stepnum', 'first');

SELECT *
FROM   crosstab(
  'SELECT usdzar_id, smoothval_id, stepnum
   FROM   steps
   ORDER  BY 1,2 ASC')  -- needs to be "ORDER BY 1,2" here
AS ct ("SV" int, "Smooth1" int, "Smooth2" int, "Smooth3" int); 

希望这有助于其他人