2011-03-07 3 views
2

다음 두 가지 모델이 관련되어 있습니다.레일스에서 ​​동시에 많은 has_many_through 개체를 저장하는 방법은 무엇입니까?

USERS 
has_many :celebrations 
has_many :boards, :through => :celebrations 

BOARDS 
has_many :celebrations 
has_many :users, :through => :celebrations 


CELEBRATIONS 
:belongs_to :user 
:belongs_to :board 

내 컨트롤러에서 양식 데이터로 개체를 만들고 싶습니다. 다음과 같이 나는이 작업을 수행 :

모델을 통해 많은 결합되어 있기 때문에
@user = User.new(params[:user]) 
    @board = Board.new(params[:board]) 
if @user.save & @board.save  
    @user.celebrations.create(:board_id => @board,:role => "MANAGER") 
    redirect_to :action => some_action 
end 

그들이에있는 양식에 표시 할 수 있도록 한 번에 오류 메시지를 생성 한 후 한 번에 저장하고 할 수있는 방법이 같은 시간?

답변

4

이 사용자 개체와 동일한 명령 @user.save와 관련된 보드 객체를 저장합니다

@user = User.new(params[:user]) 
@user.boards << @board 
@user.save 

이 할 것입니다. user_idboard_id이 저장된 중간 축하 레코드를 만들지 만, 축하 표의 다른 열의 값을 설정해야하므로 유용하지 않을 수도 있습니다.

2

당신의 방법은 나에게 꽤 표준적인 것처럼 보입니다.

  • << 트랜잭션을 사용 협회와 협력

    질문에 ... 대답하기 위해, << 운영자는 기본적으로 제외 create 방법과 동일합니다. create은 그렇지 않습니다.
  • <<은 : before_add 및 : after_add 콜백을 트리거합니다. create은 그렇지 않습니다.
  • <<은 성공한 경우 연결 프록시 (본질적으로 개체 모음)를 반환하고 성공하지 못한 경우 false를 반환합니다. create은 작성된 새 인스턴스를 리턴합니다.

귀하의 경우에 << 연산자를 사용하면 많은 거래를 할 수 있으므로 많은 도움이되지 않습니다. 작업의 모든 데이터베이스 삽입/업데이트를 원할 경우 작업을 트랜잭션으로 래핑 할 수 있습니다. 자세한 내용은 레일 API를 참조하십시오 http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

+0

<<<는 작성 방법과 동일하지 않습니다. has_many 연관 배열에 객체를 추가하기 만하면됩니다. 그런 다음 사용자 개체를 저장하면 관련 개체가 데이터베이스에 저장됩니다 (유효성 검사가 통과되면 제공됨). 'create'는 레코드를 생성하고 모든 유효성 검사가 통과되면 데이터베이스에 저장합니다. – rubyprince

+0

위의 @ user.save << @boards를 사용하여 조인 테이블에 대한 일부 특성을 포함 할 수있는 방법이 없습니다. – chell

+0

@ chell... 나는 하나를 알고 있지 않다. 나는 약간의 연구를 할 것이다. – rubyprince

관련 문제