【问题标题】:How to retrieve data from foreign key?如何从外键中检索数据?
【发布时间】:2014-04-15 08:43:45
【问题描述】:

我有两个模型

  1. 雇员
  2. 申请

    emp has_many requisitions
    requisition belongs_to emp
    

在我的控制台中:

Requisition Load (1.0ms)  SELECT "requisitions".*FROM"requisitions" WHERE "requisitions"."emp_id" = $1  [["emp_id", 3]]=> #<ActiveRecord::Associations::CollectionProxy [#<Requisition id: 7, name: "Mo
bile", particular: "jskfbhksjfkjfgweh", unit: "LVP", quantity: 7, from: "Anil",
created_at: "2014-04-05 14:27:19", updated_at: "2014-04-05 14:27:19", total: 539, cost: 77, emp_id: 3>]>

当我在我的 rails 应用中申请时

 <div class="container">
<div class="row">
    <div class="col-md-9">
        <form class = "form-inline" action="#" method="get">
            <div class="input-group">
                <input type="text" class="form-control" id="system-search" placeholder="Search" name="q" required>
                <span class="input-group-btn">
                    <button type="submit" class="btn btn-default"><i class="fa fa-search"></i></button>
                </span>
            </div>
        </form>
    </div>
</div>
  <div class = "row">
      <div class="col-md-9">
        <table class="table table-striped table-bordered table-condensed">
          <thead>
              <tr style = 'background-color: white'>
                  <th> <i class="fa fa-male"></i> Username </th>
                  <th><i class="fa fa-bars"></i> Email</th>
                  <th><i class="fa fa-bars"></i>count</th>
                  <th><i class="fa fa-bars"></i>Time</th>
                  <th><i class="fa fa-bars"></i>Last time</th>
                  <th><i class="fa fa-envelope-o"></i>ip</th>
                  <th><i class="fa fa-map-marker"></i>last ip</th>
                  <th><i class="fa fa-phone"></i>TAKE actions</th>
            </tr>
          </thead>

        <tbody>
            <% @emp.each do |e| %>
                <tr >
                  <td><%= e.username %></td>
                  <td><%= e.email %></td>
                  <td><%= e.sign_in_count %></td>
                  <td><%= e.current_sign_in_at %></td>
                  <td><%= e.last_sign_in_at %></td>
                  <td><%= e.current_sign_in_ip %></td>
                  <td><%= e.last_sign_in_ip%></td>
                  <td><button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
                      <%= e.requisitions.count %> Assets 
                      </button>

        </tbody>
    </table>
                  <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                      <div class="modal-dialog">
                        <div class="modal-content">
                          <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                                <h4 class="modal-title" id="myModalLabel"></h4>
                          </div>
                        <div class="modal-body">
                          <table class="table table-striped table-bordered table-condensed">
                            <tr style = 'background-color: white'>
                                <th> <i class="fa fa-male"></i> Asset name </th>
                                <th><i class="fa fa-bars"></i> particular</th>
                                <th><i class="fa fa-bars"></i>unit</th>
                                <th><i class="fa fa-bars"></i>quantity</th>
                                <th><i class="fa fa-bars"></i>Last cost</th>
                            </tr>                    

                            <tbody>
                              <tr>
                                <%= e.requisitions.map do |e| %>
                                  <%= e.name %>
                                  <% end %>
                              </tr>
                            </tbody>
                          </table>
                      </div>

                      <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                      </div>
                    </div>
                  </div>
                </div>


             </td>
               </tr> <%end %>




    </div>
    </div>
   </div>

问题: 而不是给出结果,而是给出

 <ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Requisition:0x3cd32c0>

【问题讨论】:

  • 在我们的聊天讨论之后,我意识到您的代码中的实际问题。我已经发布了相同的答案。如果您仍然遇到任何问题,请告诉我。

标签: ruby-on-rails rails-activerecord model-associations


【解决方案1】:

您需要对代码进行大量更改:

  1. 改变

    <%= e.requisitions.map do |e| %>
       <%= e.name %>
     <% end %>
    

    <% e.requisitions.each do |requisition| %>  
      <tr>
        <td><%= requisition.name %></td>
        <td><%= requisition.particular %></td>
         ...
      </tr>
     <% end %>
    

    删除 = 并将块变量更改为 requisition= 导致 &lt;ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Requisition:0x3cd32c0&gt; 部分出现在您的渲染输出中。你不应该渲染e.requisitions。您还需要用适当的&lt;tr&gt;&lt;td&gt; 元素包围数据。

  2. 根据聊天会话,即使在修复了第 1 点之后,您的代码仍无法正常运行。每次您单击&lt;%= e.requisitions.count %&gt; Assets 按钮时,即使您单击任何其他员工资产按钮,也会呈现第一位员工的资产。 发生这种情况是因为您对所有为模态功能创建的 div 使用相同的 id myModal

    因此,当您单击资产按钮时,DOM 会查找 ID 为 myModal 的第一个元素并将其返回。因此,您每次都会获得 1st emp 的详细信息。 为了避免这种情况,您需要为所有模态 div 设置唯一的 ID。

    替换

    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    

    <div class="modal fade" id="myModal<%= e.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    

    这将为emp with id 1 as : myModal1, emp with id 2 as : myModal2创建模态div元素的id

  3. 要使更改 #2 正常工作,您需要更新资产链接,如下所示:

    <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal<%= e.id %>">
                      <%= e.requisitions.count %> Assets 
    </button>
    

    由于data-target="#myModal&lt;%= e.id %&gt;",将选择适当的模态。对于emp with id 1 as : myModal1 would be shown, emp with id 2 as : myModal2 would be shown

【讨论】:

    【解决方案2】:

    这个

    e.requisitions
    

    将返回一个申请对象的集合:这是ActiveRecord::Associations::CollectionProxy.... 对象。然后 erb 标签会调用它的 to_s 把它变成一个字符串,显示在网页上。这就是你所看到的。

    您希望看到什么?如果您想查看与相关请购单相关的一些数据,您需要在代码中查询。由于您在那里只有一个 td 可以使用,您可能需要将相关申请中的数据聚合到一个字符串中(就像您在 .count td 上所做的那样),或者如果您想遍历申请,您将需要重新考虑你的桌子。

    EDIT1 - 对海报编辑的回应。

    你正在这样做:

    <tr>
      <%= e.requisitions.map do |e| %>
        <%= e.name %>
      <% end %>
    </tr>
    

    这将生成一个名称数组并将它们推入一个 tr。它们可能会连接在一起(取决于您的 ruby​​ 版本)并且它们不会在 td.不好。我认为您想做这样的事情:请注意,我对方法名称(尤其是 last_cost)有所猜测,因此您需要确保它是正确的。希望你能理解这个想法是什么。

    <table class="table table-striped table-bordered table-condensed">
      <tr style = 'background-color: white'>
          <th> <i class="fa fa-male"></i> Asset name </th>
          <th><i class="fa fa-bars"></i> particular</th>
          <th><i class="fa fa-bars"></i>unit</th>
          <th><i class="fa fa-bars"></i>quantity</th>
          <th><i class="fa fa-bars"></i>Last cost</th>
      </tr>                    
    
      <tbody>
        <% e.requisitions.each do |requisition| %>
          <tr>
            <td><%= requisition.name %></td>
            <td><%= requisition.particular %></td>
            <td><%= requisition.unit %></td>
            <td><%= requisition.quantity %></td>
            <td><%= requisition.last_cost %></td>
          </tr>
        <% end %>
      </tbody>
    </table>
    

    【讨论】:

    • 我已经编辑了我的代码看看,我需要更改的地方
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2019-09-04
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多