0

理论: - 在customer bill创建记录后,我发送两组数据两个不同的模型。一组数据发送到ledger,一组数据发送到ledger_line_item。复杂性在于发送数据后,我想ledger_id存储在ledger_line_item。代码如下复杂后保存在轨道上的红宝石关联

代码: -

class CustomerBill < ActiveRecord::Base 
    after_create :creating_ledger_line_items, :creating_ledger_items 

    def creating_ledger_items 
    CustomerLedger.create(:customer_id =>self.customer_id,/*rest of attributes*/) 
    end 

    def creating_ledger_line_items 
    CustomerLedgerLineItem.create(:customer_id =>self.customer_id,/*rest of attributes*/) 
    end 
end 

在总账我写

class CustomerLedger < ActiveRecord::Base 
    after_save :update_record_line_items 

    def update_record_line_items 
    a = CustomerLedgerLineItem.find_by_customer_id(self.customer_id) 
    a.update_attributes(:customer_ledger_id => self.id) 
    end 
end 

上面的代码工作正常,没有错误,但ledger_id是尚未发布的ledger_line_items。我无法确定这个错误发生的原因?有没有其他办法可以实现我的目标,即在账单创建后在ledger_line_items中发布ledger_id? 指导要求。提前感谢你。

+0

我看到它的方式您正在手动创建给定属性列表的项目。你可以通过查看'accept_nested_attributes_for'来实现你想要的,这将简化你的代码。 – jvnill 2013-03-02 05:43:29

回答

0

如下:

我假设你有Customer Model你可以改变你的模型的东西。

class Customer < ActiveRecord::Base 
    has_one :customer_ledger 
    has_many :customer_ledger_line_items, :through => :customer_ledger 
    accepts_nested_attributes_for :customer_ledger 

end 

class CustomerLedger < ActiveRecord::Base 
    has_many :customer_ledger_line_items 
    accepts_nested_attributes_for :customer_ledger_line_items 
end 

class CustomerBill < ActiveRecord::Base 
    belongs_to :customer 
    after_create :creating_ledger_items, :creating_ledger_line_items 

    def creating_ledger_line_items 
    cl = self.customer.customer_ledger.build(your_attributes) 
    cl.save! 
    end 

    def creating_ledger_items 
    cli = self.customer.customer_ledger.customer_ledger_items.build(your_attributes) 
    cli.save!  
    end 
end 
0

如果你想在* after_create *钩子上创建模型,我会解释什么是问题。

当你在rails中创建一个模型,并且你有像* after_create *,* before_update *之类的钩子时,所有的更新都发生在一个Transaction中,所以如果它们中的任何一个抛出异常,什么都不会更新。

在这种情况下,在一个事务中,您试图获取一个还不存在的CustomerLedger的ID,因为因为一切都在一个Transaction中,所以该记录不会保存到数据库,直到执行该事务,这就是CustomerLedger#update_record_line_items,self.id始终为零的原因。

使用codeit提出的嵌套属性可能是你的问题的最佳解决方案,但如果你觉得嵌套的属性其提前的话题,你可以这样做:

class CustomerBill < ActiveRecord::Base 

    after_create :created_leder_data 

    def create_ledger_data 
    customer_ledger = CustomerLedger.build(customer_id: self.customer_id, # Rest of attributes) 
    customer_ledger.customer_ledger_line_items.build(customer_id: self.customer_id, # Rest of attributes) 
    customer_ledger.save! 
    end 
end