0

이론 : - customer bill에 레코드를 만든 후, 나는 두 세트의 데이터를 두 개의 데이터를 보내고 있습니다. 한 세트의 데이터가 ledger으로 전송되고 한 세트의 데이터가 ledger_line_item으로 전송됩니다. 복잡성은 데이터를 보낸 후 ledger_idledger_line_item에 저장하기를 원합니다.복잡한 후 레일에 루비에 협회를 저장

코드를 다음과 같이 코드는 다음과 같습니다 - 내가 위의 코드가 오류없이 잘 작동하지만 ledger_idledger_line_items에 게시되어 있지 않습니다

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 

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 

원장한다. 이 오류가 발생하는 이유를 확인할 수 없습니다? 청구서를 작성한 후 ledger_idledger_line_items에 게시하는 제 목표를 달성 할 수있는 다른 방법이 있습니까? 안내 필수. 미리 감사드립니다. 난 당신이 Customer Model이 가정입니다 :

다음과 같이

+0

을 속성 목록이있는 항목을 수동으로 생성하는 것입니다. 'accepts_nested_attributes_for'를 보면서 원하는 것을 얻을 수 있습니다. 그러면 코드가 단순해질 것입니다. – jvnill

답변

0

당신은 당신의 모델 뭔가를 변경할 수 있습니다.

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 * 후크에 모델을 만들려는 경우 문제를 설명하겠습니다.

레일스에서 ​​모델을 만들고 * after_create *, * before_update * 등과 같은 후크가있는 경우 트랜잭션에서 모든 업데이트가 발생하므로 아무 것도 예외를 throw하면 아무 것도 업데이트되지 않습니다.

이 경우 트랜잭션 내에 모든 것이 트랜잭션 내에 있기 때문에 트랜잭션이 실행될 때까지 레코드가 데이터베이스에 저장되지 않기 때문에 아직 존재하지 않는 CustomerLedger의 ID를 가져 오려고합니다 , 그리고 그 이유는 CustomerLedger # update_record_line_items에서 self.id 항상 nil입니다. 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