如何通过使用另一个表中不同列的值来显示来自不同表的字段的值

时间:2016-10-27 19:38:58

标签: ruby-on-rails ruby

我意识到标题有点令人困惑但我的问题很简单。我的rails 5应用程序中有两个型号。用户和费用。每笔费用属于用户。我有一个索引页面,其中列出了所有费用。我可以从费用表中列出每个费用的用户ID,但我想在users表中查找用户名(在列用户名中),并用费用显示它。我写的观点如下。但它没有用。

<p id="notice"><%= notice %></p>

<h1>Teamjournals</h1>

<table style="padding: 2px; width: 50%" border="2px" align="center">
  <thead>
      <tr>
        <td align="center"><%= link_to new_expense_path, :class =>"btn btn-success btn-wide" do%>Add New Expense<% end %></td>
      </tr>
    <tr>
      <th>User</th>
      <th>Expense Date</th>
      <th>Currency</th>
      <th>Expense Amount</th>
      <th>Description</th>
      <th colspan="1"></th>
    </tr>
  </thead>

  <tbody>
    <% @expenses.each do |expense| %>
      <tr>
        <td><%= User.joins(:expense).where('expense.user_id = ?', @user.id) %></td>
        <td><%= expense.expense_date %></td>
        <td><%= expense.currency.currency %></td>
        <td align="right"><%= expense.expense %></td>
        <td><%= expense.description %></td>
      </tr>
    <% end %>
  </tbody>
</table>

1 个答案:

答案 0 :(得分:2)

好的,你在@expenses的迭代中就有了这一行:

<%= User.joins(:expense).where('expense.user_id = ?', @user.id) %>

您可以将其更改为:

<% user = expense.user %>

请注意,我使用<%而不是<%=,因为我只是尝试分配变量,而不是将输出打印到html。

然后在定义user后,您可以说<%= user.name %>

您应该阅读有关活动记录关联的更多信息,但这里有一些关于您已经显示的查询的附带评论

User.joins(:expense).where('expense.user_id = ?', @user.id)

在这种情况下,您应该使用belongs_to生成的方法而不是编写查询。但是在您确实想要编写自定义查询的情况下,只有在想要获取数组时才应使用where。在这种情况下,您正在寻找单个记录,以便您可以使用find_by。此外,你在这里加入的连接是不必要的

 # any of these works
 user = User.where('id = ?', expense.user_id).first
 user = User.where(id: expense.user_id).first
 user = user.find_by(id: expense.user_id)