2015-04-17 3 views
1

У меня есть две модели Order(id, user_id,...) и OrderEvent(id, order_id, ...), данные из них хранятся в двух объектах @order и @order_event.Rails Создать похожие модели

Теперь я хочу сохранить заказ и обновить order_id в OrderEvent и , а затем сохранить содержимое в базе данных.

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

Заказать

--- !ruby/object:Order 
attributes: 
    id: 
    host_id: 1 
    user_id: 1 
    order_no: PH1504-F3D11353 
    type_of_order: events 
    order_date: !ruby/object:DateTime 2015-04-17 10:49:52.066168000 Z 
    sub_total: 7050.0 
    tax_rate: 
    rate_cost: 
    deliver_charges: 
    discount_code: 
    discount_rate: 
    discount_cost: 
    total_cost: 7050.0 
    order_dishes_count: 
    order_events_count: 
    status: 0 
    created_at: 
    updated_at: 

OrderEvent

--- !ruby/object:OrderEvent 
attributes: 
    id: 
    order_id: 
    event_id: 2 
    no_of_ppl: 3 
    event_date: 2015-01-22 00:00:00.000000000 Z 
    cost: 2350.0 
    total_cost: 7050.0 
    status: 0 
    created_at: 
    updated_at: 

Заказать

class Order < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :host 

    has_many :order_events 
    has_many :messages 

end 

class OrderEvent < ActiveRecord::Base 

    belongs_to :event 
    belongs_to :order 
end 
+0

Почтовый код родственного кода модели. Кстати, вы, кажется, очень новичок в RoR, это третий вопрос, который я вижу от вас в течение часа: D: D: D – RAJ

+0

да. переходя от php к рельсам: P @ RAJ мигрирует в приложение :(обучение на ходу: P и проблемные ребята –

+0

@ RAJ отправил данные –

ответ

1

Если вы установили соответствующие ассоциации, следующий будет работать для вас:

@order = Order.create(...) 
@order_event = @order.order_events.create(...) # pass all attrs except id & order_id 

EDIT:

Если у меня есть объект сохранить готовы и просто хочешь я могу использовать. save 'вместо .create - Harsha MV

В этом случае вы можете напрямую обновить @order_event как:

@order_event.update(:order => @order) 
+0

если у меня есть готовый объект и просто хочу сохранить, могу ли я использовать «.save» вместо .create –

+0

Это не идеальное условие, однако да, вы тоже можете выжить в этом состоянии. Проверьте мое обновление в ответ. – RAJ

+0

можно передать объект, который был создан @order = Order.new() в Order.create (@order) –

1

Что вы ищете может быть:

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Если вы хотите обновить OrderEvent просто сделать

class OrderEvent 
    belongs_to :order 
end 

И в контроллере

@order_event.update_attributes(order: @order) 

Редактировать: update_attributes сохраняет базу данных.

См. http://apidock.com/rails/ActiveRecord/Persistence/update для получения дополнительной информации.

Если у вас есть обе модели готовы, но ни один не имеет идентификатор еще тогда я думаю, вы должны пойти для вложенных атрибутов:

class Order 
    accepts_nested_attributes_for :order_events 
    has_many :order_events 
end 

class OrderEvent 
    belongs_to :order 
end 

I контроллера, для того, чтобы сохранить орден, с его order_events:

def update 
    @order.update_attributes(order_events_attributes: [@order_event]) 
end 

Должно работать как очарование.

+0

может уделить вам как сохранить в базе данных –

+0

Я имею в виду, что я сделал [at] order = Order.new (params) [at] order_event = OrderEvent.new (params), и данные готовы в [at] порядке и [at] order_event Единственное, что не заполнено, это order_id в [at] order_event, который мы получим, только когда мы сохраним [at] order и его идентификатор будет сохранен в order_id в [at] order_event –

+0

Извините, пришлось использовать [at] с это не позволит использовать @ –

1

Лучшим способом является использование транзакций рельсов. Ссылка: Transactions

1

Inverse_of и accepts_nested_attributes_for позволяет одновременно создавать два связанных объекта. Ваши модели должны быть что-то вроде:

class Order < ActiveRecord::Base 

    has_many :order_events, inverse_of: :order 

    accepts_nested_attributes_for :order_events 

end 

class OrderEvent < ActiveRecord::Base 

    belongs_to :order, inverse_of: :order_event 
end 

В контроллере заказов:

def new 
    @order = Order.new 
    @order.order_events.build 
end 

def create 
    @order = Order.new(order_params) 
    ... 
end 

Allow order_events атрибуты в Params:

def order_params 
    params.require(:order).permit(order_event_attributes: []) 
end 

В форме:

<%= form_for @order do |f| %> 
    <%= f.fields_for :order_events do |event| %> 
    <!-- event fields go here --> 
<% end %> 

Вот статья с более подробной информацией о том, что делает invese_of: http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations

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