3

我正在尝试为 Ruby on Rails 中的餐厅制作预订系统。我有三张桌子:用户、桌子和预订。'users' 有 'id'、'name'、'email'、'phone' 和 'totalPersons' 列。'table' 具有列 'id' 和 'seats'。'reservations' 具有列 'id'、'user_id'、'table_id' 和 'begin_datetime'。

模型如下所示:

class User < ActiveRecord::Base
  has_many :reservations
  has_many :tables, :through => :reservations
end

class Table < ActiveRecord::Base
  has_many :reservations
  has_many :users, :through => :reservations
end

class Reservation < ActiveRecord::Base
  belongs_to :table
  belongs_to :user
end

我能够加入tablesreservations表,但我无法将三个表加入在一起。

我正在尝试显示完整的预订,其中包含姓名和用户所在的桌子。

<table>
  <thead>
    <tr>
      <th>Reserverings ID</th>
      <th>Tafel nummer</th>
      <th>Seats</th>
      <th>User</th>
      <th>Begint om</th>      
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <% @tables.each do |table| %>
      <tr>
        <td><%= reservation.id %></td>
        <td><%= reservation.table_id %></td>
        <td><%= table.seats %></td>
        <td><%= user.name %></td>
        <td><%= reservation.begin_datetime %></td>
        <td><%= link_to 'Show', table %></td>
        <td><%= link_to 'Edit', edit_table_path(table) %></td>
        <td><%= link_to 'Destroy', table, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

在控制器中,我的加入看起来像

@reservations = reservation.joins(:tables, :users)

你能帮助我吗?导轨版本 4.0

编辑:在http://guides.rubyonrails.org/我看到

    Post.joins(:comments => :guest)

生成的 SQL 是:

    SELECT posts.* FROM posts
    INNER JOIN comments ON comments.post_id = posts.id
    INNER JOIN guests ON guests.comment_id = comments.id

我猜我的所有用户预订的 SQL 代码和他们预订的桌子看起来像

    SELECT * FROM reservations, users, tables
    INNER JOIN reservations ON reservations.user_id = users.id
    INNER JOIN reservations ON reservations.table_id = tables.id

也许这会为你澄清事情。所以现在我需要知道它是如何在 ruby​​ on rails 中产生的。

4

2 回答 2

6

Rails 允许您在字符串中编写自定义连接条件,如下所示:

Reservation.joins('INNER JOIN "tables" ON "tables"."id" = "reservations"."table_id" INNER JOIN "users" ON "users"."id" = "reservations"."user_id"')

或者更简洁,只需指定几个连接子句:

Reservation.joins(:user).joins(:table)

要提取数据,您只需应用一些自定义select子句,如下所示:

Reservation.joins(:user).joins(:table).select("tables.seats AS table_seats")

与加入相同,您可以应用其中的几个。集合中的每个返回对象都将具有与您在“AS”之后定义的列名相同的名称方法(在这种情况下它将是 . 但是有一个问题 - 所有这些都将作为字符串返回,因为 AR 不能真正猜猜那些是什么。

于 2013-10-08T18:30:25.737 回答
1

您应该使用“includes”而不是“joins”。此外,当您循环通过 @tables 打印预订时,预订和用户未定义。你至少需要说:

@tables.each do |table|
  reservation = table.reservation
  user = reservation.user
  ...
end
于 2013-06-17T12:52:53.640 回答