Create if no function exists in ActiveRecord?

I am using Rails 3.2.8. I need to create a status record if the status record does not exist yet. If a status record exists, I do nothing. So my code looks something like this:

user_level_status = UserLevelStatus.where(user_id: user_id, level_id: level_id).first if !user_level_status UserLevelStatus.create(user_id: user_id, level_id: level_id, status: UserLevelStatus::READY) end 

Is there a better way to handle this in Rails / ActiveRecord? Is there an equivalent mechanism like find_or_create_by_ ? Can I use find_or_create_by_user_id and also check for level_id ? I would simply refuse the results so that even this is not so elegant.

+6
source share
4 answers

Yes there is.

Rails 3

 user_level_status = UserLevelStatus.find_or_create_by_user_id_and_level_id(user_id, level_id) 

Rails 4:

 user_level_status = UserLevelStatus.find_or_create_by(user_id: user_id, level_id: level_id) 

And you should set default status in your model .

+15
source

You have to use

 UserLevelStatus.where(user_id: user_id, level_id: level_id).first_or_create(status: UserLevelStatus::READY) 
+4
source

Use find_or_create_*

 hash = {user_id: user_id, level_id: level_id, status: UserLevelStatus::READY} UserLevelStatus.find_or_create_by_user_id_and_level_id_and_status(hash) 

EDITED For your case, you should use the following

 hash = {user_id: user_id, level_id: level_id} UserLevelStatus.find(:first, :conditions => hash) || UserLevelStatus.create(hash.merge({status: UserLevelStatus::READY}) 
+1
source

Another alternative is

 UserLevelStatus.where(user_id: user_id, level_id: level_id).first || UserLevelStatus.create(user_id: user_id, level_id: level_id, status: UserLevelStatus::READY) 
0
source

Source: https://habr.com/ru/post/925914/


All Articles