2013-09-07 2 views
0

사용자가 새 예약 레코드를 만들면 입력 한 데이터의 일부가 전자 메일 주소가됩니다. 이 전자 메일 주소는 아직없는 경우 새로운 게스트 레코드를 동시에 만드는 데 사용됩니다. 예약시 게스트 ID가 레코드의 일부로 포함되어야합니다. 내 모델에서레일 4 - 여러 관계 구축

나는 그렇게 관계를 정의했습니다 :

... 
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 
... 

내 질문

은 다음과 같습니다 :

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

이것은 내가 내 BookingsController의 생성 작용에 지금까지 무엇을 가지고

  • 새 예약에서 게스트 ID를 사용하려면 '빌드'를 두 번 사용해야합니까?
  • 손님이 이미 이메일을 사용하고 있는지 어떻게 확인할 수 있습니까?
  • 손님을 구성 할 때 params [: 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)) 

당신은 그것의 주요 사용은 여전히 ​​기본 키가없는 객체와 연관 관계를 유지하는 것입니다 때문에 #create 방법에 build을 사용할 필요가 없습니다. 하지만 여기에 물건을 넣어두면 루비의 좋은 오래된 new으로 갈 수 있습니다.

+0

아 - 내가 병합 할 수 있다는 것을 몰랐습니다. 외래 키를 추가하려면 Rails에 맡겨야한다고 생각했습니다. 또한 current_user.accommodation 줄에서 내 머리를 얻으 려합니다. 숙박 시설에 더 많은 사용자가있는 관계로 인해 나타나는 것 같습니다. – tommyd456

+0

글을 작성했기 때문에 그 줄을 넣었습니다. :) – depa