【问题标题】:Attribute a Row, Nested Below (How to Show Proper Relationship in Table?)属性一行,嵌套在下面(如何在表中显示正确的关系?)
【发布时间】:2015-02-01 20:43:27
【问题描述】:

这是我在过去几个月开始我的 Ruby on Rails 之旅时遇到的最困难的问题。

似乎很多人都会面对它,但我在网上找不到任何可以解决这个问题的东西,这意味着我的问题要么非常简单,要么我想得太难了,要么我问错了问题。请帮助我找到正确的答案和/或正确的问题!

当用户提交表单时,它包括属性(量化)和嵌套属性(结果)。当用户单击索引时,我希望他看到量化在标题行中创建了一个新列(对于每个新的量化实例,它水平地穿过页面)。然后,对于他提交或稍后添加的每个结果,我希望他看到结果在该列中创建一个新行(垂直向下移动页面)。

我希望我解释得很好,并没有让它听起来比实际更令人困惑。

这是我可以使用 html 标签使表格看起来像的一种变体:

这是另一个变体:

但无论出于何种原因,我都无法得到这个,这就是我想要的:

此时我真的不知道,因为我已经尝试了所有方法,你需要什么代码来帮助我,所以我不会在这里全部倾销,而是通过 github 在这里给你:https://github.com/RallyWithGalli/ruletoday

更新

使用下面帕特里克的回答,我可以让表格看起来像这样:

但它的问题是,如果用户添加了另一个量化参数,例如冥想 (min),并且包含的​​结果行比它前面的行多,那么结果将向左移动,直到它碰到具有那么多行或更多行的另一列。在上面的例子中,“2.1”应该在冥想列,但它却落入了重量列。

更新 2.0

下面是 Patrick 的更新:

再次感谢您尝试 Patrick。是你让我坚持到这一步。你提到了引导程序。我再看一遍。

提前感谢您的帮助!我将永远欠你的债。

【问题讨论】:

    标签: ruby-on-rails dynamic nested-attributes


    【解决方案1】:

    这很棘手,因为数据是按列排列的,但我们需要按行排列。我不是 100% 确定我了解量化数据的布局方式,但解决方案的要点是,您需要两个单独的循环,因为标题 <thead> 和数据 <tbody> 位于 <table> 的不同部分中。让我们重新计算平均值:

    <h2>AVERAGE</h2>
    <%
      averaged_data_rows = {} 
    %>
    <%# averaged_data_rows should end up as:
      {
        0 => [result, result, result],
        1 => [result, result, result],
        etc.
      }
    %>
    <table>
      <thead>
        <tr>
          <% @averaged_quantifieds.each do |averaged| %>
            <% if averaged.user == current_user %>     
              <th><%= averaged.name %> (<%= averaged.metric %>)</th>
              <% 
                averaged.results.each_index do |idx|
                  averaged_data_rows[idx] ||= []
                  averaged_data_rows[idx] << averaged.results.to_a[idx]
                end
              %>
            <% end %>
          <% end %>
        </tr>
      </thead>
      <tbody>
        <% averaged_data_rows.values.each do |row| %>
          <tr>
            <% row.each do |result| %>
              <td>
                <%= result.date_value.strftime("%m-%Y") %>
                &nbsp;
                <%= result.result_value %>
              </td>
            <% end %>
          </tr>
        <% end %>
      </tbody>
    </table>
    

    更新

    我害怕那个。另一种可能性是按列保留数据并执行浮动无序列表。使用像Bootstrap 这样的网格框架会很有帮助。但这是一个快速且非常肮脏的想法,可以工作(假设您不在乎重量(磅)列没有 02-2015 值,因此它的 03-2015 值与另一个 02-2015 值相邻值):

    <h2>AVERAGE</h2>
    <div>
      <% @averaged_quantifieds.each do |averaged| %>
        <% if averaged.user == current_user %>
          <%# 
            Inline CSS like this is generally frowned upon. I am using it
            here for demonstration purposes only. The best solution would
            be to use Bootstrap or something like it to get the side-by-side
            view on wide screens and top-to-bottom view on smaller screens.
            But I think that is outside the context of this particular question.
          %>
          <div style="float:left; width:200px;">
            <h4><%= averaged.name %> (<%= averaged.metric %>)</h4>
            <ul>
              <% averaged.results.each do |result| %>
                <li>
                  <%= result.date_value.strftime("%m-%Y") %>
                  &nbsp;
                  <%= result.result_value %>
                </li>
              <% end %>
            </ul>
          </div>
        <% end %>
      <% end %>
    

    【讨论】:

    • 非常感谢帕特里克!我们就快到了。我在上面的代码中添加了一个小问题,希望你能帮我解决它。再次感谢!!出于好奇,您是如何知道答案的?
    • @AnthonyGalli 我根据您的 cmets 更新了我的答案。我已经在网站上工作了几年。这种数据可视化问题很正常。几乎每个拥有数据库的网站都至少有一个地方,服务器端代码循环遍历结果集以构建表格。
    • 我可以想象很多人都在经历这场斗争,我很惊讶这有多难。我在网上找不到任何关于它的信息。既然你说引导程序不在这个问题的范围内,你能引导我找到为此目的使用引导程序的人的资源吗?我不知道下一步该做什么。还是有其他方法可以调整您的答案以获得预期的答案?再次感谢帕特里克。
    • @AnthonyGalli 对此感到抱歉。我在更新的答案中错过了一个重要细节。
        中的每个结果都必须包含在
      • (列表项)标签中。这应该让他们每个人都进入一个新的行。
    • 我想我明白你想要做什么。如果您想要示例链接中的表格视图,那么我认为您将需要不同的数据处理来强制数据上的日期范围,以便您知道列中何时存在漏洞。但是,如果您希望它是动态的,我认为这种无序列表解决方案可能会更好。看起来这是人们想要在手机上使用的应用程序,而 HTML 不能很好地转移到手机上;特别是如果它可以有大量的列。
    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多