0

我有一个值数组,例如:

- @colors.each do |color|
  = check_box_tag 'colors[]', color.id

每次,当我从数据库表中的那些复选框更新值时,我都是这样做的:

    UserColor.delete_all(['user_id = ?'], current_user.id) #delete all user's rows

    unless params[:colors].nil?
      params[:colors].each do |color|
        UserColor.create(:user_id => current_user.id, :color_id => color)
      end
    end

这是可行的解决方案,但我不太喜欢它。这就是为什么我想问你,你如何解决这个问题,如果不存在任何更好的方法来做到这一点。

谢谢

4

2 回答 2

1

我会在用户模型中定义一个方法

def update_colors!(new_color_ids)
    # get an array of the current color ids
    old_color_ids = user_colors.map(&:color_id)

    # destroy colors that appear in the old list but not in the new
    user_colors.where(color_id: old_color_ids - new_color_ids).destroy_all

    # add colors that appear in the new list but not in the old
    (new_color_ids - old_color_ids).each do |add_color_id|
        user_colors.create!(color_id: add_color_id)
    end
end

从控制器,只需调用

    current_user.update_colors!(params[:colors])

.

于 2012-06-09T15:35:46.853 回答
1
class User
  has_many :colors, through: :user_colors
end

在控制器中

if params[:colors]
  user = current_user
  user.color_ids = params[:colors]
  user.save
end

或者你可以试试

current_user.update_attribute(:color_ids, params[:colors]) if params[:colors] 
于 2012-06-09T15:36:11.637 回答