Ruby - 如何将复选框中的值保存到数据库中

时间:2012-06-09 14:48:04

标签: ruby-on-rails ruby checkbox

我有一系列值,例如:

- @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

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

由于

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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]