0

次のような値の配列があります。

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

毎回、DBテーブルのチェックボックスの値を更新するときは、次のように実行しています。

    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 に答える