Написание запроса к массиву Rails - PullRequest
0 голосов
/ 23 января 2012

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

Вот набросок псевдокода.

Запрос к базе данных ЗАКАЗЧИКА. Убедитесь, что UPDATED_RECORD является уникальным для NAME. Если это НЕ уникальный, проверьте, принадлежит ли его ID к записи, которая обновляется. Если это так, это нормально, так как это тот же идентификатор и должно быть разрешено сохранить то же имя. Если запрос находит то же имя, с которым связан другой идентификатор, то должно отображаться сообщение об ошибке, например «Это имя уже используется 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 Ответ

1 голос
/ 23 января 2012

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

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

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

РЕДАКТИРОВАТЬ

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

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
...