【问题标题】:Display data in columns not rows using Ruby on Rails使用 Ruby on Rails 在列而不是行中显示数据
【发布时间】:2010-01-24 20:27:12
【问题描述】:

我想在我的网页中以列而不是行的形式显示数据。

使用 Ruby on Rails 最有效的方法是什么?

非常感谢您的帮助!

【问题讨论】:

  • 请提供更多信息,您的代码,任何东西。你不能回答这样的问题。
  • 抱歉,这有点困难,因为我无法添加图片,也无法弄清楚如何格式化文本以显示我想要实现的布局示例。如果我有一个在@records 中返回一组记录的索引操作,我的脚手架布局会显示表中的所有字段,列名沿着表的顶部,并且记录向下运行。相反,我想要表格左侧的列名,以及整个页面列中的记录。

标签: html ruby-on-rails


【解决方案1】:

简单的解决方案是使用数组“旋转”信息。像这样(伪)代码(无法检查是否 atm)
控制器代码:

@stuffs = Stuff.find(:all)
@rotated = []
@rotated[0] = [] # Stuff column0
@rotated[1] = [] # Stuff column1
# etc
index = 0
# Now put the stuff in an array for easy(ier) access
@stuffs.each do |stuff|
  @rotated[0][index] = stuff.detail0
  @rotated[1][index] = stuff.detail1
  index += 1
end

在你的视图中,你需要这样的东西:

<table>
Table head here!
<% 2.times do |row| %>  # Build table (we have 2 stuff details, hence the 2 here)
  <tr>
  <% index.times do |column| %>
    <td><%= @rotated[row][column] %></td>
  <% end %>
  </tr>
<% end %>
<table>

当然有更好的解决方案,但这对我来说似乎是最简单/通用的。从某个模型中旋转一些数据。

正如其他人所说,我们可以为您提供更多信息!

【讨论】:

  • 嘿 - 这对我来说非常有效。只有一个小问题 - 我需要将 index++ 更改为 index+=index。非常感谢。
【解决方案2】:

改编自较早的similar question/answer

def rotate(matrix)
  columns = matrix.first.size
  rows = matrix.size
  result = []
  columns.times { |y|
    result[y] = []
    rows.times { |x|
      result[y][x] = matrix[x][y]
    }
  }
  result
end

我相信这可能被称为“转置”,因为您实际上只是想将第 1 行变成第 1 列,而不是旋转数组,以此类推。也就是说,如果您逆时针旋转四分之一圈,array[0][0] 将出现在左下角。上面的实现假设你仍然希望 [0][0] 留在左上角:

1 2 3 4
5 6 7 8
9 0 a b

1 5 9
2 6 0
3 7 a
4 8 b

我还假设所有行都具有相同数量的元素/列。

哦,嘿,你不知道吗:Array#transpose...

<%= render :partial => 'mytable', :collection => @array.transpose %> # untested

【讨论】:

  • 这种方法看起来很棒。没有完全清楚可能是我的错,但我无法让 .first.size 与我的 ActiveRecord 对象一起使用这就是我选择上述答案的原因。
  • mine 几乎是一个辅助方法,但总的来说它只是 Array#transpose 的一个实现。猜猜那部分不清楚。如果您有一个二维数组,您只需执行 @array.transpose 即可获得与我在上面说明的相同的结果。
【解决方案3】:

如果您从数据库中提取数据,您应该考虑使用 PIVOT 运算符(至少在 SQL Server 中 - 我不确定 SQLLite 或 MySQL)。这样,您仍然可以使用“正常”的 UI 方法,并且仍然以列而不是行的形式显示数据。只是一个想法......

【讨论】:

    【解决方案4】:

    这是我的解决方案。它需要一个数组,比如["a", "b", "c", "d"],然后将其转换为这个数组:[["a", "b"], ["c"], ["d"]],然后可以很容易地使用它来显示列中的数据。

    def categories_in_columns(categories, number_of_groups=3)
      groups = []
      elements_per_column       = categories.size / number_of_groups
      extra_elements            = categories.size % number_of_groups
      has_extra_elements        = (extra_elements > 0 ? 1 : 0)
    
      0.upto(number_of_groups-1).each do |i|
        groups[i] = []
        while groups[i].size < (elements_per_column + has_extra_elements)
          groups[i] << categories.shift
          extra_elements -= 1 if groups[i].size > elements_per_column
        end
        has_extra_elements = 0 if extra_elements == 0
        groups[i].compact!
      end
      groups.delete_if { |i| i.empty? }
    end
    

    及其规格:

    it "arranges categories into columns" do
      categories_in_columns(["a", "b", "c", "d", "e"]).should == [["a", "b"], ["c", "d"], ["e"]]
      categories_in_columns(["a", "b", "c", "d"]     ).should == [["a", "b"], ["c"], ["d"]]
      categories_in_columns(["a", "b", "c"]          ).should == [["a"], ["b"], ["c"]]
      categories_in_columns(["a", "b"]               ).should == [["a"], ["b"]]
      categories_in_columns(["a"]                    ).should == [["a"]]
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多