2012-01-23 3 views
0

Мне нужно написать валидацию, чтобы убедиться, что новые записи, созданные в нашем приложении, не имеют повторяющихся имен. Мне сказали, что validates_uniqueness не будет работать в этом случае, потому что приложение уже использует его для проверки создания исходного имени. Эта проверка будет гарантировать, что когда запись будет обновлена ​​с новым именем, это тоже, является оригинальным ... это своего рода анти-видимость. Запрос также должен быть нечувствительным к регистру, поэтому мне нужно будет написать его с помощью функции UPPER() MYSQL, поэтому мне нужно будет использовать запрос массива, а не хэш.Запись запроса Array Rails

Вот эскиз псевдокода.

Запросить базу данных CUSTOMER. Установите флажок UPDATED_RECORD, чтобы узнать, уникально ли его NAME. Если это НЕ уникальный чек, чтобы узнать, соответствует ли его идентификатор записи, которая обновляется. Если это так, это нормально, так как это один и тот же идентификатор, и ему должно быть разрешено сохранять одно и то же имя. Если запрос находит то же имя, у которого есть другой идентификатор, связанный с ним, тогда должно отображаться сообщение об ошибке, например «Это имя уже используется XXXX».

Я довольно новичок в Rails, и у меня был медведь времени, получив это правильно.

Вот некоторые разъяснения по поводу того, почему я не думаю, что validates_uniqueness будет работать здесь.

Я думаю, что проблема связана с несколькими версиями одной и той же записи, если обновленная запись представляет собой новую версию той же записи (она имеет тот же самый идентификатор записи), то это действительно. Но если новая версия записи обновляется с именем, которое уже используется существующей записью (с другим идентификатором записи, то это не должно быть разрешено. Например, имея две записи с временной версией, {: record_id => 100,: name => «Test»} & {: record_id => 100,: name => «Test»}, должно быть разрешено, поскольку эти две записи являются версиями одного и того же термина. Но имея две записи: {: record_id => 100, : name => «Test»} & {: record_id => 201,: name => «Test»}, не должно быть разрешено, так как это приведет к тому, что две версии будут иметь одно и то же имя, но связаны с разными терминами.

+1

Таким образом, вы сохранили имя в базу данных, а затем проверить, является ли имя уникальный ??? Почему бы не проверить наличие перед вставкой в ​​базу данных ??? – PeterWong

+0

Что касается вашей привязки: вы должны просто не допускать случайные дубликаты данных в вашем db. –

ответ

1

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

class MyModel < ActiveRecord::Base 
    validates_uniqueness_of :original_name 
    validates_uniqueness_of :new_name, :case_sensitive => false 
end 

Когда вы создаете новую запись или обновляете существующую, эти проверки пройдут. Вы также можете установить проверку уникальности в миграции, добавив в нее индекс. Это обеспечивает дополнительную безопасность.

EDIT

Что касается Вашего разъяснения, возможно, было бы проще добавить пользовательскую проверку следующим образом:

class MyModel < ActiveRecord::Base 
    validate :check_names 

    private 

    def check_names 
     existing = MyModel.find_by_name(self.name) 
     unless existing.nil? 
      if existing.record_id != self.record_id 
       self.errors[:base] << "This name already exists for a different record_id" 
      end 
     end 
    end 
end 
+0

Я добавил изменения относительно того, почему у меня возникли проблемы с выяснением того, как будет действовать validates_uniqueness. – acdanger

+0

См. Мое редактирование для другой идеи, основанной на вашем новом разъяснении. – MrDanA

+0

Это выглядит многообещающе. Одна из вещей, над которыми я также боролась, заключалась в том, как написать функцию SQL для того, чтобы сделать запрос в верхнем регистре и, следовательно, нечувствительным к регистру. Любая помощь в этом была бы потрясающей. – acdanger