如何从外键中检索数据?

时间:2014-04-15 08:43:45

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

我有2个模特

  1. EMP
  2. 征用

    emp has_many requisitions
    requisition belongs_to emp
    
  3. 在我的控制台中:

    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>
    

2 个答案:

答案 0 :(得分: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=导致<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Requisition:0x3cd32c0>部分渲染输出。你不应该渲染e.requisitions。您还需要使用适当的<tr><td>元素包围数据。

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

    因此,当您单击资产按钮时,DOM将查找标识为myModal的第一个元素并将其返回。因此,您每次都会获得第1 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">
    

    这将为id

  3. 创建div模态emp with id 1 as : myModal1, emp with id 2 as : myModal2元素
  4. 要使更改#2正常工作,您需要更新资产链接,如下所示:

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

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

答案 1 :(得分:0)

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>