2012-01-31 45 views
0

我不知道如何找出這一個,因爲我不知道如何更新我的中間表,而不必做delete_all。或者做插入和刪除等 我有三類:我如何使用checkobxes在rails中更新中間表?

class User < ActiveRecord::Base 
    has_many :players 
    has_many :teams, :through => :players 
end 

class Team < ActiveRecord::Base 
    has_many :players 
end 

class Player < ActiveRecord::Base 
    belongs_to :team 
    belongs_to :user 
    (contains other columns like, is_captain, has_paid, etc.) 
end 

我顯示與複選框一個頁面,你可以選擇你想「用戶」是你的團隊(從你的通訊錄)。所以想象列出25個名字,其中一些已經被檢查過,而另一些則沒有。我怎麼能保存複選框的數據,因爲他們可能有3種不同的狀態:1)插入全新的球員(插入行中的球員)2)從球隊中刪除球員(刪除現有球員)或3)什麼都不做(你不玩想在你的團隊)

我遇到的問題是,當你'取消'一個框,然後前端不發送到後端?任何想法如何可以做得很好?

回答

0

不知道這是要做到這一點的最好辦法,但它的作品,我願意接受建議改善這種代碼

params[:team][:user_ids] ||= [] 
    @team = Team.find(params[:team][:id]) 
    current_players = @team.players 
    current_players_user_ids = current_players.collect { |player| player.user_id } 
    user_ids = params[:team][:user_ids] 
    puts "input ids #{user_ids}" 
    #add current_user because checkbox does not pass them in since its 'disabled' 
    user_ids << current_user.id 

    #delete the current_players that are not in the the received 'checkboxes' 
    current_players_user_ids.each do |current_player_user_id| 
     unless user_ids.include?(current_player_user_id) 
     Player.delete_all(:team_id => @team.id, :user_id => current_player_user_id) 
     end 
    end 

    #iterate through input ids and run 'inserts' on those who are not current-players 
    user_ids.each do |user_id| 
     unless current_players_user_ids.include?(user_id) 
     player = Player.new(:user_id=>user_id, :team_id=>@team.id) 
     @team.players << player 
     end 
    end