RoR — Validates_existence_of с нулевым внешним ключом не работает

Я использую гем validates_existence_of. Это работает хорошо, за исключением случаев, когда я хочу, чтобы мой внешний ключ был равен нулю.

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

Вот моя пользовательская модель:

class User < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  has_many :projects, :dependent => :destroy
  has_many :user_trimester_statuses, :dependent => :destroy
end

И вот моя модель проекта:

class Project < ActiveRecord::Base
  attr_accessible :added, :amount, :contributor_id, :label, :ref, :trimester_id,    :user_id
  belongs_to :user
  belongs_to :contributor, :class_name => 'User'
  belongs_to :trimester
  validates :user, :existence => { :both => false }
  validates :trimester, :existence => { :both => false }
  validates :contributor, :existence => { :allow_nil => true, :both => false }
end

Когда я пытаюсь добавить новый проект, у меня возникает ошибка, если поле user_id или trimester_id пустое или недопустимое. Но для поля contributor_id ошибка не возникает, если поле недействительно. Он проходит в любом случае (действительный, недействительный или нулевой).

Что я делаю неправильно? Я использую рубин 2.0.0p0 и рельсы 3.2.13.


person nax_    schedule 08.04.2013    source источник


Ответы (1)


Похоже, в проекте есть открытая ошибка по этому поводу.

https://github.com/perfectline/validates_existence/issues/15

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

ОБНОВЛЕНИЕ: я только что клонировал проект и написал тест, чтобы узнать, в чем проблема. Кажется, что когда вы добавляете allow_nil, валидатор существования вообще не вызывается. Я не уверен, почему это так, но в то же время вы можете легко обойти эту ошибку, используя proc. вместо

validates :contributor, :existence => { :allow_nil => true, :both => false }

это сделает работу

validates_existence_of :contributor, :unless => Proc.new { |obj| obj.contributor_id.blank? }

Я смог доказать это в своем тестовом примере. (Я использовал метод «validates_existence_of» вместо «validates», потому что я думал, что в этом случае это будет чище)

person J_McCaffrey    schedule 08.04.2013
comment
Отлично, спасибо. По крайней мере, это не моя вина! Я новичок в RoR, поэтому напишу собственный валидатор. - person nax_; 08.04.2013