проверка отношения has_one в рельсах - PullRequest
3 голосов
/ 30 июля 2009

Поскольку has_one не обеспечивает обратный вызов before_add для проверки, как я могу предотвратить рельсы разрушить старую ассоциацию, даже когда новый не проходит проверку?

Сьюзен: has_one: рубашка рубашка: принадлежит_: Сьюзен

susan.shirt = a_nice_shirt

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

susan.build_shirt

делает то же самое

Есть ли веская причина для пропущенного обратного вызова before_add, который я пропустил?

Ответы [ 3 ]

2 голосов
/ 31 июля 2009

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

class UserObserver< ActiveRecord::Observer
  def before_save(user)
    return false if user.shirt.color != "red"
  end
end

Если вы вернете false в наблюдателе, объект не будет сохранен. Конечно, ваш текущий экземпляр «Сьюзен» все еще будет иметь недопустимую связь. Я не уверен, но если вы измените before_save_ в наблюдателе на что-то вроде этого:

class UserObserver< ActiveRecord::Observer
  def before_save(user)
    if user.shirt.color != "red"
      user.reload
      false
  end
end

Может обновить экземпляр вашего пользователя. Я никогда этого не пробовал.

0 голосов
/ 26 сентября 2009

Посмотрите на этот билет:

http://dev.rubyonrails.org/ticket/10518

Похоже, что описанная функциональность все еще присутствует, если у вас есть: зависимый =>: уничтожить в вашей ассоциации.

Лично я думаю, что это ошибка в рельсах.

0 голосов
/ 04 августа 2009

В Rails проверка обычно выполняется при попытке сохранить объект в базе данных (используя save или save!), а не при его изменении. Если по какой-либо причине вы хотите восстановить старое значение при сбое проверки, вы можете либо reload объект, либо использовать новую функцию грязных атрибутов .

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