Как я могу определить, нарушает ли мой объект ActiveRecord уникальную базу данных, key/index?

Вы можете использовать этот запрос:

"UPDATE parkingslot SET status = 'Avail' where status IS NULL OR status = '' "
6
задан Chinasaur 7 April 2009 в 07:07
поделиться

2 ответа

Парсинг сообщения об ошибке не так плох, но чувствует себя топорным. Предложение, на которое я натыкался (не помнят, где), который кажется обращением, то, что в спасательном блоке можно проверить базу данных, чтобы видеть, существует ли на самом деле дублирующаяся запись. Если существует, то возможностями является 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.

Надежда, которая полезна! Другие подходы?

7
ответ дан 10 December 2019 в 02:53
поделиться

Это - действительно такая большая проблема?

Если Вы используете уникальный индекс вместе с a validates_uniqueness_of ограничение, затем

  • Целостность данных будет сохраняться
  • Вы в худшем случае только получите ошибку, когда два отдельных запроса попытаются вставить групповую строку одновременно

Таким образом, если у Вас нет приложения, которое делает многих, потенциальный дубликат вставляет (в этом случае, я посмотрел бы на перепроектирование этого), я вижу это редко быть проблемой на практике.

2
ответ дан 10 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: