2015-04-17 79 views
1

我有两个模型Order(id, user_id,...)和​​这些数据存储在两个对象@order@order_eventRails一起创建相关模型

现在我想保存订单并更新OrderEvent中的order_id和 然后将内容保存到数据库中。

在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 

OrderEvent

class OrderEvent < ActiveRecord::Base 

    belongs_to :event 
    belongs_to :order 
end 
+0

相关型号代码的邮政编码。顺便说一句,你在RoR看起来很初学,这是我在一小时内看到的第三个问题:D:D:D – RAJ

+0

是的。从php转移到rails:P @ RAJ迁移应用程序:(学习在旅途中:P和令人不安的问题 –

+0

@RAJ发布数据 –

回答

1

如果设置正确的关联,下面会为你工作:

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

编辑:

如果我有对象准备就绪,只是想救我可以用”。保存'而不是.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

如果你有两个模型准备好,但没有有一个id又那么我认为你应该去嵌套属性:

class Order 
    accepts_nested_attributes_for :order_events 
    has_many :order_events 
end 

class OrderEvent 
    belongs_to :order 
end 

我控制器,为了节省订单,其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只有那些没有填充的东西是[at] order_event中的order_id,我们只有当我们保存[at]顺序并且它的ID保存在[at] order_event –

+0

的order_id中时才会获得,对不起,不得不使用[at]它不会允许使用@ –

1

最好的方法是使用轨道交易。参考:Transactions

1

Inverse_of and accepted_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 

允许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