csvファイルをインポートする処理を以下のように記述しました。
model/user.rb の次のコードで、Userモデルから条件に一致したレコード、一致していない場合には新たに作成してくれてます。
user = find_by('note = ? AND text = ? AND number = ?', row["note"], row["text"], row["number"]) || new
これと同じ挙動をuser.controller.rbで行いたい場合にはイイ案はあるでしょうか?
*例えば、上記のuserで、一致したものをupdate_userとして返し、一致しないものはnew_userとするなど
上記の後に、user.saveを行うと一致したものはupdate、一致しないものはcreateしてくれるのでとても便利なのですが、その前後で新たに処理を行いたいためです。
またモデル内で処理する場合、csvから取り込んだレコードの各カラム(row["name"]など)にカスタムでvalidateメソッドを作成することは可能でしょうか?
もし、よろしければ教えていただきたいです。
controller
1def import 2User.import(params[:file]) 3redirect_to users_url 4end
model
1class User < ApplicationRecord 2 def self.import(file) 3 CSV.foreach(file.path, headers: true, encoding: 'Shift_JIS:UTF-8') do |row| 4 user = find_by('note = ? AND text = ? AND number = ?', row["note"], row["text"], row["number"]) || new 5 user.attributes = row.to_hash.slice(*updatable_attributes) 6 user.save 7 end 8 end 9 10 def self.updatable_attributes 11 ["id","name","age","text","note","number"] 12 end 13 14end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 12:27
2020/09/01 12:32 編集
2020/09/02 09:47