Вопрос об обновлении Rails ActiveRecord

У меня есть модель пользователя с несколькими адресами. Теперь для моего приложения на рельсах адрес не обязателен. Итак, если кто-то хочет создать пользователя и ввести адрес после того, как пользователь был создан, мое приложение должно разрешить это. Моя проблема в том, что для модели адреса у меня есть проверки для строки адреса 1, города и почтового индекса. Эти поля не могут быть пустыми. Когда при редактировании пользователя следующий код дает сбой:

user.addresses ‹‹ Address.new

Rails пытается создать новый Address и запускает команду Insert. Это не удастся из-за проверок, которые требуются в модели. Приведенный выше код не дает сбоя, если пользователь отсутствует в базе данных. Одним из решений этой проблемы является создание отдельной привязки form_for для партиала редактирования для пользователя. Я не хочу делать это решение. Есть ли какое-либо решение, которое позволяет мне привязать пустой объект Address к уже существующему объекту User в базе данных?


person user49550    schedule 30.12.2008    source источник


Ответы (2)


Зачем пытаться добавить пустой объект Address в коллекцию user.addresses? Я думаю, вы могли бы просто сделать что-то вроде:

user.addresses << Address.new unless (conditions)

К сожалению, я не знаю, какие у вас здесь условия, так что это может быть что-то вроде

user.addresses << Address.new unless params[:address].nil?

... хотя я предполагаю, что у вас есть настоящий объект Address, а не просто передача пустого Address.new...

person sammich    schedule 30.12.2008

user.addresses << Address.new

Этот код в любом случае не будет работать, если ваша модель адреса требует установки своих полей, потому что вы не предоставляете хэш для Address.new

Если вы хотите добавить адрес условно, вы, вероятно, захотите что-то вроде этого:

if !params[:address].blank?
  user.addresses.create(params[:address])
end

or

user.addresses << Address.new(params[:address]) unless params[:address].blank

Если вы действительно хотите создать «пустой» объект адреса для каждого пользователя (вместо того, чтобы просто иметь пользователей без адресов), вы можете изменить свои проверки, чтобы они срабатывали только в том случае, если поля заполнены.

Что-то вроде этого:

class Address < ActiveRecord::Base
  validates_presence_of :address1, :if => :non_empty_address?
  # etc

  private
    def non_empty_address?
     !address1.blank? || !address2.blank || !city.blank? # etc
    end
end

Плагин restful_authentication использует аналогичный подход, чтобы определить, требуется ли пароль пользователя.

person Luke Francl    schedule 31.12.2008