Recently on a Rails project, I had the need to create a
shelf record and associate it with a
book record. (These particular records are using a
has_many :through relationship).
The problem I ran into was the need to search for a
book to associate with; if it didn't exist, I needed to create it first... I found that Rails has me covered.
find_or_create_by will either find a record with the provided attributes, or create it. (shocker)
Here's how I used it:
def add shelf = find_or_create_shelf book = find_or_create_book SavedBook.create(book_id: book.id, shelf_id: shelf.id) redirect_to user_to_read_path(params[:user_id]), notice: '✓ Book saved for later.' end private def find_or_create_book Book.find_or_create_by(id: params[:book_id], image: params.dig(:book, :image), title: params.dig(:book, :title), author: params.dig(:book, :author)) end def find_or_create_shelf Shelf.find_or_create_by(user_id: params[:user_id]) end