Почему обновление этой модели не вызывает проверки? - PullRequest
2 голосов
/ 27 июля 2011

С Rails 3.1 у меня есть:

class Status < ActiveRecord::Base
  has_many :participations, :dependent => :destroy
  has_many :users, :through => :participations

  validates :users, :presence => true
end

В моем модульном тесте я делаю:

user = User.create(:name => "Bob")
status1 = Status.create(:description => "available")
user.statuses << status1

и получите:

ActiveRecord :: RecordInvalid: проверка не удалась: пользователи не могут быть пустыми

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

status1.users << user

работает нормально.

Почему проверка запускается для:

user.statuses << status1

UPDATE:

тест в полном объеме

 test "Return all statuses associated with the manager" do
    manager = Manager.create(:email => "foo@bar.com", :password => "password", :password_confirmation => "password")

    workshop = Workshop.create(:name => "Bob Autos")
    manager.workshop = workshop
    manager.save

    user = User.create(:name => "a customer")

    workshop.users << user

    status1 = Status.create(:description => "Car is ready")
    status2 = Status.create(:description => "problem with exhaust")
    status3 = Status.create(:description => "parts delivered")

    user.statuses << status1
    user.statuses << status2

    assert_equal([status1, status2], manager.statuses)

    user.statuses << status3

    assert_equal([status1, status2, status3], manager.statuses)
  end

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Проверка включена Status, а не User. Проверка модели запускается только при обновлении этой модели, и вы фактически не обновляли модель User (поскольку statuses является ассоциацией, а не полем).

Если вы хотите, чтобы валидация одного объекта запускала валидацию другого, вам следует использовать validates_associated:

class Status
  validates_associated :users
end

(Тем не менее, в связанной заметке, почему у Status много пользователей? Похоже, что Status должен быть только у одного пользователя.)

1 голос
/ 27 июля 2011

Поскольку коллекция status1.users не обновляется автоматически при user.statuses << status1

...