我有一系列值,例如:
- @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
这是可行的解决方案,但我不太喜欢它。这就是为什么我想问你,你如何解决这个问题,如果不存在任何更好的方法。
由于
答案 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]