2012-01-31 50 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