2014-09-09 6 views
0

Я уверен, что делаю это неправильно, но я не вижу, где. У меня есть эти две модели:Rails - создать родительский и дочерний в то же время в has_one принадлежит_to

Subscription.rb (ребенок)

class Subscription < ActiveRecord::Base 
    attr_accessible :state, :subscriber_id, :subscriber_type, :last_payment 

    belongs_to :subscriber, polymorphic: true 

    validates :subscriber_id, presence: true 
    validates :subscriber_type, presence: true 
end 

restorer.rb (Parent)

class Restorer < User 
    attr_accessible :firstname, :lastname, :restaurant_attributes, :subscription_attributes 

    has_one :restaurant, dependent: :destroy, :autosave => true 
    has_one :subscription, as: :subscriber, :autosave => true 

    accepts_nested_attributes_for :restaurant 
    accepts_nested_attributes_for :subscription 

end 

Когда я хочу два создать новый реставратор и новая подписка (в то же время) Не работает:

def create 
    @restorer = Restorer.create params[:restorer] 
    @restaurant = @restorer.build_restaurant params[:restorer][:restaurant_attributes] 
    @subscription = @restorer.build_subscription params[:restorer][:subscription_attributes] 

    if @restorer.save 
     ... 
    else 
     ... 
    end 
    end 
+0

если вы используете 'save' вы sould заменить' 'create' в new', также вам не нужно использовать' строить _ .. 'Мануалы (он должен работать автоматически) и попробуйте 'save!', которые поднимают сообщение, если что-то не так. – IS04

+0

он поднимает ошибку record_invalid ... кажется, с этой ошибкой 'subscriber_id не должен быть пустым' – p0k3

+2

Это связано с тем, что вы не можете проверить наличие 'id' для' nested_attributes', поскольку они по существу создаются почти 'асинхронно''' id' будет сохранен до сохранения после завершения сохранения. Если вы действительно должны подтвердить это, что я не чувствую, что вы делаете с вложенными атрибутами, тогда вам придется создавать эти объекты на этапе с помощью процедуры, например. создайте подписчика, затем создайте ассоциации. Вы можете справиться с этим в транзакции, но у меня мало опыта с этим. – engineersmnky

ответ

3

Рассматривая комментарии и ваш код, похоже, причина, по которой она не работает, связана с валидацией на Subscriber. Restorer имеет один Subscription и Subscription относится к Subscriber. Нигде вы не создаете подписчика, поэтому почему подписка не проходит проверку. Вам необходимо либо удалить проверки, либо установить эти проверенные свойства (subscriber_id и subscriptioner_type) на Subscriber.

Это своего рода немного валовые то, что вы пытаетесь сделать в вашей создать, но это должно выглядеть примерно так, если вы собираетесь сделать это таким образом:

def create 
    @restorer = Restorer.create params[:restorer] 

    # These two lines aren't needed if you are accepting nested attributes 
    @restaurant = @restorer.build_restaurant params[:restorer][:restaurant_attributes] 
    @subscription = @restorer.build_subscription params[:restorer][:subscription_attributes] 

    subscriber = Subscriber.new params[:subscriber] 
    @subscription.subscriber = subscriber 

    if @restorer.save 
    ... 
    else 
    ... 
    end 
end 

Btw, лучше, чтобы проверить правильность отношения subscriber, а не идентификатор subscriber_id:

validates :subscriber, presence: true 
+0

+1 для «рода бит брутто», ссылаясь на код – Jim

 Смежные вопросы

  • Нет связанных вопросов^_^