Отображать данные в столбцах, а не в строках, используя Ruby on Rails - PullRequest
1 голос
/ 24 января 2010

Я хотел бы отображать данные в столбцах, а не в строках на моей веб-странице.

Какой самый эффективный способ сделать это с помощью Ruby on Rails?

Большое спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 25 января 2010

Простым решением было бы «вращать» информацию, используя массив. Как этот (псевдо) код (не может проверить, атм)
Код контроллера:

@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>

Конечно, есть лучшее решение, но мне оно кажется наиболее простым / общим. Чтобы повернуть некоторые данные из некоторой модели.

Как и другие говорили с большей информацией, мы можем помочь вам, вероятно, намного лучше!

0 голосов
/ 29 августа 2012

Вот мое решение. Он берет массив, скажем ["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
0 голосов
/ 25 января 2010

Если вы извлекаете данные из базы данных, вам следует рассмотреть возможность использования оператора PIVOT (по крайней мере, в SQL Server - я не уверен насчет SQLLite или MySQL). Таким образом, вы все равно можете использовать «нормальные» методы пользовательского интерфейса и по-прежнему отображать данные в столбцах, а не в строках. Просто мысль ...

0 голосов
/ 25 января 2010

Адаптировано из более раннего, аналогичного вопроса / ответа :

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

Я также предполагаю, что все строки имеют одинаковое количество элементов / столбцов.

О, эй, а разве ты не знаешь? Массив # транспонировать ...

<%= render :partial => 'mytable', :collection => @array.transpose %> # untested
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...