2011-06-23 20 views
1

Ruby on Railsを使用していますが、find_or_create_by_custom_stuffメソッドがあります。しかし、私は戻ってくるオブジェクトが見つかったか、作成されたかどうかを知りたいです。このようなものオブジェクトがRuby on Railsのデータベースから新しく作成されたかどうかを確認します

user = User.find_or_create_by_custom_stuff(params[:user]) 
if user.was_found_from_database? 
    ... 
elsif user.was_recently_created? 
    ... 
end 

ユーザーのcreated_atタイムスタンプに依存せずにこれを行う方法はありますか?

答えて

2

。その理由は、ほとんどの場合、ファインダーのパターンが作成されたパターンから分岐するからです。

別のアプローチは次のようになります。

user = User.custom_finder(params) 
if user.blank? 
    user = User.create(params) 
    #some business logic goes here 
else 
    #other business logic goes here 
end 

また、これはあなたがfind_or_initialize_byしようとすると、その後new_recordを行うことができ、より良い構造

+0

これはこれを行うより良い方法です。 'create'を使うと、新しいオブジェクトがデータベースに残っていることを意味します。したがって、(created_atを見ていない限り、それは見つからないオブジェクトと見分けがつきません。 – Luke

+0

が合意しました。find_or_new_by_whatever(...)に行くと感謝します、ありがとう! – Schneems

11

user = User.find_or_create(params[:user]) 
user.new_record? 

あなたのためにあなたはその

​​

ためのActiveRecordの方法があります:私はfind_or_createの*メソッドを使用しないようにしようと

.new_record? => NOT RECORDED IN DATABASE 
+1

.new_record?この場合、常にfalseを返します(ユーザーはUser.find_or_createの後にDBで作成されたオブジェクトです) – tamersalama

+0

@Tamer Salamaが正しいです!私の反応は間違っている!あなたの応答は効果的に働きます、私は謝罪します... –

0
user = User.find_or_create_by_custom_stuff(params[:user]) 
if user.new_record? 
    # record does not exist in datastore 
else 
    ... 
end 
+0

user.new_record? DB作成オブジェクトなので常にtrueを返します。 find_or_create_ *は検索を試み、存在しなければ作成します。したがって、返されるオブジェクトは作成されたレコードです。 – tamersalama

+0

ああ、そうです。私は「創造」ではなく「新」を考えていた。ありがとうございました。 – Luke

-1
user_total = User.count 
user = User.find_or_create_by_custom_stuff(params[:user]) 
if user_total == User.count 
#No new user was created, find method was used. 
... 
else 
#New user created, create method was used. 
... 
end 
0

のためのUserモデルに実装されるだろうか?チェック。あなたの新しいレコードを保存する機会を得る前に、ユーザーを作成することができます。 find_or_create_byでも同じ問題がありますが、これはそのようなことが起こるための大きなウィンドウを与えるかもしれません。

user = User.find_or_initialize_by(email: params[:email]) 
if user.new_record? 
    if user.save 
    render json: user, status: :created 
    else 
    render json: { errors: @like.errors }, status: :unprocessable_entity 
    end 
else 
    render json: user 
end 
関連する問題