41

Active Record で create if not exists else 更新レコードを実装しようとしています。

現在使用中:

@student = Student.where(:user_id => current_user.id).first

if @student
    Student.destroy_all(:user_id => current_user.id)
end

Student = Student.new(:user_id => current_user.id, :department => 1
)
Student.save!

レコードが存在する場合、またはレコードを作成する場合、レコードを更新する正しい方法は何ですか?

4

7 に答える 7

17

first_or_createまたは同様のものを探している可能性があります:

http://guides.rubyonrails.org/v3.2.17/active_record_querying.html#first_or_create

于 2013-01-30T08:03:42.340 に答える
7
@student = Student.where(user_id: current_user.id).first
@student ||= Student.new(user_id: current_user.id)
@student.department_id = 1
@student.save

これは、ユーザーと学生の間に関連付けがある場合に便利です。の線に沿った何か

@student = current_user.student || current_user.build_student
@student.department_id = 1
@student.save

編集:

http://guides.rubyonrails.org/active_record_querying.html#first_or_createを Sevenseacat の回答として使用することもできますが、学生の部門 ID の更新など、さまざまなシナリオに対処する必要があります。

アップデート:

使用できますfind_or_create_by

@student = Student.find_or_create_by(user_id: current_user.id) do |student|
  student.department_id = 1
end
于 2013-01-30T08:07:17.330 に答える
0

残念ながら、これを行う最もクリーンな方法は次のとおりだと思います。

Student.where(user_id: id).first_or_create(age: 16).update_attribute(:age, 16)
于 2017-01-17T02:45:58.027 に答える
-4

first_or_createではなくfind_or_create_byです。
例: Client.find_or_create_by(first_name: 'Andy')

于 2014-01-31T10:43:52.183 に答える