Ruby on Rails连接多个表以及如何提取数据

时间:2013-06-17 12:24:35

标签: ruby-on-rails-4

我正在尝试在Ruby on Rails上为餐馆预订系统。我有三个表:用户,表和预订。 '用户'列有' id',' name',' email',' phone'和' totalPersons'。 '表'有列' id'和'席位' '保留'有列" 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)
你能帮帮我吗? Rails版本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

也许这会为你澄清一些事情。所以现在我需要知道它是如何在轨道上的红宝石中产生的。

2 个答案:

答案 0 :(得分: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")

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

答案 1 :(得分:1)

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

@tables.each do |table|
  reservation = table.reservation
  user = reservation.user
  ...
end