我正在尝试在 Ruby on Rails上为餐馆预订系统.我有三个表:用户,表和预订. ‘users’包含列’id’,’name’,’email’,’phone’和’totalPersons’. ‘table’有列’id’和’seat’. ‘reservations’包
模型看起来像这样:
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
我能够加入桌子和预订表,但我无法加入这三个.
我试图显示一个完整的预订名称和用户在什么表.
<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
也许这会为你澄清一些事情.所以现在我需要知道如何在轨道上的ruby中产生.
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)
要提取数据,您只需应用一些自定义选择子句,如下所示:
Reservation.joins(:user).joins(:table).select("tables.seats AS table_seats")
与join相同,您可以应用其中的几个.集合中返回的每个对象都具有与在“AS”之后定义列名称相同的名称方法(在这种情况下它将是.虽然有一个捕获 – 所有这些将作为字符串返回,因为AR不能真正猜猜那些是什么.