Обход проверок во время миграции только данных, чтобы исправить ошибки проверки - PullRequest
7 голосов
/ 11 февраля 2011

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

проверка в модели является новой:

 validates_uniqueness_of :job_id , :scope => [:day, :time, :user_id , :overtime, :comments] , :message => "Duplicate Entry, Please check your data"
 validates_uniqueness_of :job_id , :scope => [:day, :user_id, :comments] , :message => "Has 2 Entires for same job on same day with same comment"

- это совершенно новый тип, а другой просто изменился с 24 на 8 и добавил бит сверхурочных

  validates_numericality_of :time, :greater_than => 0, :less_than_or_equal_to => 8
  validates_numericality_of :overtime, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 16

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

Есть ли другой способ, кроме обновления базы данных, а затем обновления этого файла, чтобы обойти это?или это то, что я должен делать?

Ответы [ 2 ]

21 голосов
/ 11 февраля 2011

в Rails 2:

object.save(false)

в Rails 3 & 4:

object.save(:validate => false)

Эти методы обойдут все проверки объекта, поэтому будьте осторожны!

1 голос
/ 08 октября 2012

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

В Rails 2 или 3 нет способа превратить одну проверкувкл или выкл.Тем не менее, мы широко используем задачи по заполнению в наших проектах, поэтому у нас есть небольшой обходной путь для этого.

Это немного утомительно, если вы хотите сделать это для каждой отдельной проверки, но обычно ту, которую вы хотите «повернуть»off 'на некоторое время немного, и далеко между ними.

class FooModel < ActiveRecord::Base

  validates_uniqueness_of :foo_name, :unless => :dont_check_foo_name
  attr_accessor :dont_check_foo_name

end

Если вы следуете строгому соглашению об именах, когда вы создаете объект, вы можете просто установить для соответствующего dont_check_ * validation_name * значение true, и это-пройдите валидацию.

Также, для вашего второго комментария, следующее:

object.save(false)
object.save!(false)

работает таким же образом.

И, конечно, условная валидация Iупомянутые работы на обоих также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...