Вы можете использовать этот запрос:
"UPDATE parkingslot SET status = 'Avail' where status IS NULL OR status = '' "
Парсинг сообщения об ошибке не так плох, но чувствует себя топорным. Предложение, на которое я натыкался (не помнят, где), который кажется обращением, то, что в спасательном блоке можно проверить базу данных, чтобы видеть, существует ли на самом деле дублирующаяся запись. Если существует, то возможностями является StatementInvalid, из-за дубликата, и можно обработать его соответственно. Если нет, то StatementInvalid должен быть от чего-то еще, и необходимо обработать его по-другому.
Так основная идея, принимая уникальный индекс на recipe.name
как выше:
begin
recipe.save!
rescue ActiveRecord::StatementInvalid
if Recipe.count(:conditions => {:name => recipe.name}) > 0
# It's a duplicate
else
# Not a duplicate; something else went wrong
end
end
Я попытался автоматизировать это сверяющееся со следующим:
class ActiveRecord::Base
def violates_unique_index?(opts={})
raise unless connection
unique_indexes = connection.indexes(self.class.table_name).select{|i|i.unique}
unique_indexes.each do |ui|
conditions = {}
ui.columns.each do |col|
conditions[col] = send(col)
end
next if conditions.values.any?{|c|c.nil?} and !opts[:unique_includes_nil]
return true if self.class.count(:conditions => conditions) > 0
end
return false
end
end
Таким образом, теперь необходимо смочь использовать generic_record.violates_unique_index?
в Вашем спасательном блоке, чтобы решить, как обработать StatementInvalid.
Надежда, которая полезна! Другие подходы?
Это - действительно такая большая проблема?
Если Вы используете уникальный индекс вместе с a validates_uniqueness_of
ограничение, затем
Таким образом, если у Вас нет приложения, которое делает многих, потенциальный дубликат вставляет (в этом случае, я посмотрел бы на перепроектирование этого), я вижу это редко быть проблемой на практике.