2016-10-01 5 views
0

나는 세 가지 모델이 : 사용자, 그룹 및 GroupUser연관을 통해 has_many에서 레코드를 관리하는 가장 좋은 방법은 무엇입니까?

class User < ActiveRecord::Base 
    has_many :group_users 
    has_many :groups, through: :group_users 

class Group < ActiveRecord::Base 
    has_many :group_users 
    has_many :users, through: :group_users 

class GroupUser < ActiveRecord::Base 
    belongs_to :group 
    belongs_to :user` 

을 나는 모든 사용자에 대한 체크 박스에 주어진 그룹의 양식을 작성, 그래서 각 사용자가 그룹에 있는지 여부를 확인 할 수 있고, 내가 할 수있는 사용자가 그룹에 속하는지 확인하려면 그룹에 추가 할 사용자를 선택하십시오. 그런 다음 양식을 제출 한 후 사용자의 ID 배열을 그룹에 추가합니다.

내 질문 : 컨트롤러 또는 다른 곳에 작업 (여러 추가/삭제 레코드)을 제출 한 후이를 코딩하는 가장 좋은 방법은 무엇입니까?

이 목적을 위해 GroupsController에서 두 개의 추가 작업을 만들었습니다 : 확인란을 여는 양식의 경우 def select_users, 추가 및 삭제의 경우 def add_users.

def select_users 
    @group = Group.find(params[:id]) 
    end 

    def add_users 
    @group = Group.find(params[:id]) 
    # Add new users 
    new_users = params[:group][:user_ids] 
    old_users = @group.users.map {|x| x.id.to_s } + [""] 
    add_users = new_users.reject { |item| old_users.include?(item) } 

    add_users.each do |id| 
     @group.users << User.find(id) 
    end 

# Delete unwanted users 
    delete_users = old_users.reject { |item| new_users.include?(item) } 
    @group.group_users.where(user_id: delete_users).destroy_all 

    redirect_to groups_path, notice: 'Users were added.' 

    end` 

나는 테이블을 조인 컨트롤러 GroupUser을 만들고 편안하고 '새'와 '생성', 그러나 나는 확실하지 오전 작업을 수행 할 때 할 수있는 방법이 최선의 것을 넣을 수 있었다.

+0

또한 'def select_users'는 꽤 혼란 스럽습니다. 만약 당신이 그것을 find_group이라고 부를 것입니다. 그것은 add_users에서 사용하지 말고 그것을 정의하는 것은 의미가 없다고 말했습니다. 만약 당신이 그런 식으로 뭔가를 정의하고 컨트롤러에서 이전 작업에 괜찮을 것이라고 사용하고 싶지만 실제로는 도움이되지 않는다고 생각합니다. –

답변

0

가장 좋은 방법은 스키니 컨트롤러와 뚱뚱한 모델을 만드는 것입니다. 그래서 저는 컨트롤러에 두 가지 방법을 사용하지 않을 것입니다. 컨트롤러는 단일 모델 방법을 이상적으로 호출해야합니다. 지금까지와 같은 편안한 대회가 나는 그룹 컨트롤러에 대한 업데이트 작업에이 되었는데요 그룹 모델

def update_users(user_ids) 
    new_users = User.where(id: user_ids) 
    final_users = new_users + self.users 
    self.users = final_users.uniq 
    self.save 
end 

에 뭔가

def add_users 


@group = Group.find(params[:id]) 
    # Add new users 
    new_users = params[:group][:user_ids] 
    old_users = @group.users.map {|x| x.id.to_s } + [""] 
    add_users = new_users.reject { |item| old_users.include?(item) } 

    add_users.each do |id| 
    @group.users << User.find(id) 
    end 
end 

을하고 accepts_nested_attributes_for 옵션을 사용 : 그래서 나는 이것을 변경합니다.

def update 
    @group = Group.find(params[:id]) 
    if @group.update_users(params[:group][:user_ids]) 
    #handle success 
    else 
    #handle error 
    end 
end 
0

1) GroupsController에서 이러한 모든 작업을 수행하지 마십시오. 복잡합니다. 새로운 루비 클래스를 생성하여 처리하십시오.

2) 확실하지 않지만 컬렉션에 사용자를 할당 할 수 있으며 연결을 통해 쓸 것입니다. 따라서 :

@group.users = User.where(id: [1,2,4]) # you can just give it your params[:group][:user_ids] here as the array 
@group.save! # also not sure if this is necessary 
+0

다른 유효한 옵션입니다. 개인적으로 그것의 행동 양식에 나는 양식 지지체를 사용하지 않을 것입니다. 만약 그룹이 더 복잡해지면 폼을지지하는 객체로 PORO (평범한 오래된 루비 객체)를 사용할 것이라고 말했습니다. 그것에 대한 자세한 내용은이 문서를 참조하십시오 : https://blog.pivotal.io/labs/labs/form-backing-objects-for-fun-and-profit OP 양식의 지각 된 기술 수준이 주어지면 약간 발전되었지만 이것을 해결하는 나쁜 방법은 아닙니다. –

관련 문제