Я кодировал этот искатель, который можно использовать для разных сценариев.
Самое важное, что при создании и обновлении он удаляет параметр :id
.
Создание модели с :id
может вызвать проблемы с MySql
или PostgreSQL
, поскольку Rails использует автоматический порядковый номер базы данных. Если вы создаете новые экземпляры модели с :id
, вы можете получить UniqueViolation: ERROR: duplicate key value violates unique constraint
.
# config/initializers/model_finders.rb
class ActiveRecord::Base
def self.find_by_or_create(attributes, &block)
self.find_by(attributes) || self.create(attributes.except(:id), &block)
end
def self.find_by_or_create!(attributes, &block)
self.find_by(attributes) || self.create!(attributes.except(:id), &block)
end
def self.find_or_create_update_by(attributes, &block)
self.find_by(attributes).try(:update, attributes.except(:id), &block) || self.create(attributes.except(:id), &block)
end
def self.find_or_create_update_by!(attributes, &block)
self.find_by(attributes).try(:update!, attributes.except(:id), &block) || self.create!(attributes.except(:id), &block)
end
def self.find_by_or_initialize(attributes, &block)
self.find_by(attributes) || new(attributes.except(:id), &block)
end
end