2013-09-07 2 views
0

Когда пользователь создает новую запись о бронировании, часть введенных данных является адресом электронной почты. Этот адрес электронной почты используется для создания новой записи гостя одновременно, если они еще не существуют. При бронировании должен быть идентификатор гостя как часть записи.Rails 4 - Строительство нескольких отношений

В моей модели я определил отношения так:

accommodations has_many bookings 
guests has_many bookings 
bookings belongs_to accommodations 
bookings belongs_to guests 

Это то, что я до сих пор в создании действия моего BookingsController:

... 
def create 
    accommodation = current_user.accommodation  
    @booking = accommodation.bookings.build(post_params) 
    @guest = accommodation.guests.build(params[:email]) 

    if @booking.save 
    flash[:success] = 'The booking has been added successfully.' 
    redirect_to :controller => 'bookings', :action => 'index' 
    else 
    render 'new' 
    end 
end 
... 

Мои вопросы:

  • Должен ли я использовать 'build' дважды, так как я хочу, чтобы новое бронирование имело идентификатор гостя?
  • Как проверить, существует ли гостевая система с помощью электронной почты?
  • Безопасно ли/безопасно использовать параметры [: email] при создании гостя?
+0

И почему новый гость может отличаться от текущего пользователя, так это то, что он может заказать кого-то еще? – depa

+0

пользователи и гости разные - пользователи создают заказы от имени гостей – tommyd456

ответ

1

Если вы не используете @guest в представлении, нет необходимости, чтобы это была переменная экземпляра. Итак:

accommodation = current_user.accommodation 
guest = Guest.find_or_create_by(:email => params[:email]) 
@booking = accommodation.bookings.new(post_params.merge(:guest_id => guest.id)) 

Вам не нужно использовать build в методе #create, поскольку его основное назначение заключается в поддержании ассоциации связей с объектами, которые до сих пор не имеют первичный ключ. Но так как вы упорствуете своими вещами здесь, мы можем пойти с добрым старым new от Ruby.

+0

ah - Я не понимал, что вы можете слиться вот так - я думал, вам нужно оставить его в Rails, чтобы добавить внешние ключи. Также, пытаясь окунуться в строку current_user.accommodation, поскольку это, похоже, противоречит отношениям, так как у размещения больше, чем у одного пользователя. – tommyd456

+0

Ну, я просто положил туда эту строку, потому что вы ее написали. :) – depa

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