2017-10-24 3 views
0

두 가지 모델이 있습니다 : 사용자와 역할. 한 명의 사용자가 많은 역할을 할 수 있습니다.레일즈 : 새로운 연결에 대한 activerecord 업데이트

user1에 role1과 role2가 있다고 가정합니다. 이제 user1이 role2와 role3을 갖기를 원합니다.

class User < ActiveRecord::Base 

    has_and_belongs_to_many :roles 

class Role < ActiveRecord::Base 

    has_and_belongs_to_many :users 

이 내 코드

user = User.find(1) 
newrole = Role.find(2) #get role3 

user.roles[0] = newrole 

user.roles[0].save # does not work 

user.save # does not work 

내 문제를 해결하기 위해 레일에 루비의 올바른 방법은 무엇입니까?

+0

'user.roles.new = "newrole"'및'user.roles.save' – Gabbar

+0

새 역할을 추가하지 않고 role1 -> role3을 업데이트하고 싶습니다. –

+0

역할 모델의 역할에 대한 열 이름은 무엇입니까? – Gabbar

답변

4

오히려 role1에서 role3에 기록을 갱신하는 것보다 간단한 방법은 role1에 대한 기록을 삭제하고 role2 새로운 만드는 것입니다.

has_and_belongs_to_many의 경우 필요한 것은 ID와 레일이 자동으로 처리해야합니다.

예 : 레일 콘솔

:

-> @user = User.first 
-> puts @user.role_ids 
    # [1,2] 

-> @user.role_ids = [2, 3] 

이것은 role1을 삭제하고 role3

편집에 대한 기록을 생성하여 사용자에게 새 역할을 할당합니다. html.erb (보기) :

이제

def update 
    respond_to do |format| 
    if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
    else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

private 

def user_params 
    params.require(:user).permit(:first_name, :last_name, role_ids: []) 
end 

당신이 role2role3를 선택 :

User에 대한 양식을 가지고 다중 선택

<%= form_for(book) do |f| %> 
    <div class="field"> 
    <%= f.label :first_name %> 
    <%= f.text_field :first_name %> 
    </div> 

    <div class="field"> 
    <%= f.label :roles %> 
    <%= f.collection_select :role_ids, Role.all, :id, :name, {}, {:multiple => true} %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

users_controller.rb (컨트롤러)roles에 대한 드롭 다운이 있다고 가정하자 , 양식을 제출하면 레일스는 role1에 대한 레코드를 삭제하고 role3

0에 대한 레코드를 삭제하면됩니다.
1
user.roles.destroy(Role.find(1)) # assuming Role.find(1) == role1 
user.roles << Role.find(3) # assuming Role.find(3) == role3 
+0

이것이 OP 문제를 해결하는 이유를 자세히 설명해야합니다 – vu1p3n0x

관련 문제