我正在尝试在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
我能够加入tables
和reservations
表,但我无法加入这三个表。
我正在尝试使用名称和用户在哪个表格中显示完整的预订。
<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
也许这会为你澄清一些事情。所以现在我需要知道它是如何在轨道上的红宝石中产生的。
答案 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