检查Ruby on Rails中是否从数据库中新创建或检索了对象

时间:2011-06-23 20:26:06

标签: ruby-on-rails ruby

我正在使用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时间戳的情况下做到这一点?

5 个答案:

答案 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