我正在使用Ruby on Rails,我有一个find_or_create_by_custom_stuff方法。但是,我想知道我找回的对象是否已找到,或者是否已创建。像这样的东西
user = User.find_or_create_by_custom_stuff(params[:user])
if user.was_found_from_database?
...
elsif user.was_recently_created?
...
end
有没有办法可以在不依赖用户的created_at时间戳的情况下做到这一点?
答案 0 :(得分:11)
你有
的ActiveRecord方法@instance.new_record?
为你
user = User.find_or_create(params[:user])
user.new_record?
注意:
.new_record? => NOT RECORDED IN DATABASE
答案 1 :(得分:2)
我会尝试不使用find_or_create *方法。原因是几乎总是取景器模式与创作模式不同。
另一种方法可能是:
user = User.custom_finder(params)
if user.blank?
user = User.create(params)
#some business logic goes here
else
#other business logic goes here
end
这也可以在User模型中实现,以获得更好的结构
答案 2 :(得分:0)
user = User.find_or_create_by_custom_stuff(params[:user])
if user.new_record?
# record does not exist in datastore
else
...
end
答案 3 :(得分:0)
您可以尝试find_or_initialize_by然后执行new_record吗?校验。要记住的一件事是,在您有机会保存新记录之前,可以创建用户。你也有同样的问题与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
答案 4 :(得分:-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