2016-10-01 25 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並把那個地方作爲REST風格的「新」和「創造」,但我不知道行動是最好的辦法。

+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中做所有這些事情 - 它會讓它變得混亂。創建一個新的普通ruby類來處理它。

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-b​​acking-objects-for-fun-and-profit我想說,OP表單支持對象的感知技能級別可能是有點先進但不是一個不好的方法來解決這個問題。 –

相關問題