Проверка Свойства Модели Больше, чем Другой

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

Я теперь пытаюсь проверить это свойство модели (терминология?) больше, чем другой. Это, казалось, было идеальным экземпляром для validates_numericality_of с greater_than опция, но увы который бросает ошибку при сообщении мне greater_than expects a number, not a symbol. Если я пытаюсь преобразовать тип того символа .to_f Я добираюсь undefined method ошибка.

Вот то, что я в конечном счете сделал и мне любопытно относительно того, существует ли лучший путь. Это - просто простая система для управления выпусками проекта, у нас только есть главные/незначительные выпуски (одна точка), таким образом, плавание чувствовало себя подобно правильному решению здесь.

class Project < ActiveRecord::Base
    validates_numericality_of :current_release
    validates_numericality_of :next_release
    validate :next_release_is_greater

    def next_release_is_greater
        errors.add_to_base("Next release must be greater than current release") unless next_release.to_f > current_release.to_f
    end
end

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

Соответствующий модульный тест:

# Fixture data:
#   PALS:
#     name: PALS
#     description: This is the PALS project
#     current_release: 1.0
#     next_release: 2.0
#     project_category: 1
#     user: 1
def test_release_is_future
    project = Project.first(:conditions => {:name => 'PALS'})
    project.current_release = 10.0
    assert !project.save

    project.current_release = 1.0
    assert project.save
end
31
задан Michael Wales 22 December 2009 в 13:03
поделиться

2 ответа

Как вы заметили, единственный способ - использовать собственный валидатор. Параметр: better_than должен быть целым числом. Следующий код не будет работать, потому что и текущий, и следующий выпуск доступны только на уровне экземпляра.

class Project < ActiveRecord::Base
  validates_numericality_of :current_release
  validates_numericality_of :next_release, :greater_than => :current_release
end

Цель параметра better_than - проверить значение на соответствие статической константе или другому методу класса. .

Так что не возражайте и используйте свой собственный валидатор. :)

27
ответ дан 27 November 2019 в 22:35
поделиться

Это лучший способ выполнить пользовательскую валидацию, однако, вы, возможно, захотите изучить нечто наподобие factory_girl в качестве замены исправления (которое, похоже, вы используете):

http://github.com/thoughtbot/factory_girl

Тогда ваш юнит-тест будет выглядеть следующим образом:

def test_...
    Factory.create(:project, :current_release => 10.0)
    assert !Factory.build(:project, :current_release => 1.0).valid?
end 
-2
ответ дан 27 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

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