2013-06-17 2 views
3

Я пытаюсь создать систему бронирования для ресторанов в Ruby on Rails. У меня три таблицы: пользователи, таблицы и оговорки. «Пользователи» имеют идентификаторы столбцов, «имя», «электронная почта», «телефон» и «totalPersons». «table» имеет идентификаторы столбцов и «места». «Оговорки» имеют столбцы «id», «user_id», «table_id» и «begin_datetime».Ruby on Rails, соединяющий несколько таблиц и извлечение данных

модели выглядят следующим образом:

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

EDIT: На 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 

Возможно, это прояснит вам все. Поэтому теперь мне нужно знать, как это получается в рубине на рельсах.

+1

Какая версия рельсов? Можете ли вы показать нам свою попытку присоединиться к столам, чтобы мы могли помочь вам исправить? – kushyar

+0

Я отредактировал свой вопрос. Версия Rails 4.0 – user2493145

+0

Один пользователь или все пользователи с их оговорки? – kushyar

ответ

1

Вы должны использовать «includes» вместо «join». Также, когда вы перебираете @tables для печати оговорок, резервирование и пользователь не определены. Вы должны, по крайней мере, сказать:

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

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 не может реально угадайте, что это такое.

+1

Он присоединяется и не присоединяется – vadimtar

Смежные вопросы