2012-05-16 27 views
0

我有一個發票控制器和兩個模型發票和invoice_line_items,並使用invoice_line_item類創建tax_line_items。下面是我的代碼:如何編輯與has_many關係相關的訂單項,但使用單個類?

這裏是我的控制器代碼:

class InvoicesController < ApplicationController 
def new 
    @menu = 'Income' 
    @page_name = 'Create new invoice' 
    @invoice = Invoice.new 
    @invoice.invoice_line_items.build 
    @invoice.tax_line_items.build 

    respond_to do |format| 
     format.html 
     format.xml { render :xml => @invoice } 
    end 
    end 
end 

我的發票型號:

class Invoice < ActiveRecord::Base 

    has_many :invoice_line_items 
    has_many :tax_line_items, :class_name => "InvoiceLineItem",:dependent => :destroy 

    accepts_nested_attributes_for :invoice_line_items, :reject_if => lambda {|a| a[:account_id].blank? } , :allow_destroy => true 
    accepts_nested_attributes_for :tax_line_items, :reject_if => lambda {|a| a[:account_id].blank? } , :allow_destroy => true 
end 

,並在我的方式,我用:

<%= form_for(@invoice) do |f| %> 
<%= render 'shared/form_error', :object => @invoice %> 
<% @invoice.invoice_line_items.each_with_index do |invoice_line_item, index| %> 
        <%= render "invoice_line_items", :invoice_line_item => invoice_line_item, :index => index %> 
       <% end %> 
<% @invoice.tax_line_items.each_with_index do |tax_line_item, tax_index| %> 
         <%= render "tax_line_items", :tax_line_item => tax_line_item, :tax_index => tax_index %>  
       <% end %> 
<%end%> 

諧音:

1)invo ice_line_items:

<tr id="row<%= index %>" valign="top" > 
      <%= hidden_field_tag "invoice[invoice_line_items_attributes][#{index}][id]",invoice_line_item.id%> 
      <td valign="top"> 
       <%= select_tag "invoice[invoice_line_items_attributes][#{index}][account_id]", options_from_collection_for_select(@from_accounts, :id, :name,:selected => invoice_line_item.account_id), :include_blank => true, :class=>"full" %> 
       <!-- <a href="/accounts/new?account_head_id=10" > New item</a> --> 
      </td> 
     <td><%= text_area_tag "invoice[invoice_line_items_attributes][#{index}][description]",invoice_line_item.description, :class => "full", :cols => 10, :rows=>1 %></td> 
     <td><%= text_field_tag "invoice[invoice_line_items_attributes][#{index}][quantity]",invoice_line_item.quantity, :class => 'full', :id => 'quantity', :onkeydown => "return numbersOnly(event);", :size => 5, :maxlength => 25 %></td> 
     <td><%= text_field_tag "invoice[invoice_line_items_attributes][#{index}][unit_rate]",invoice_line_item.unit_rate, :class => 'full', :id => 'unit_cost', :onkeydown => "return numbersOnly(event);", :size => 5, :maxlength => 20 %></td><!--Jquery code is in application.js--> 
     <td><%= text_field_tag "invoice[invoice_line_items_attributes][#{index}][discount_percent]", invoice_line_item.discount_percent, :class => 'full', :id => 'discount', :onkeydown => "return numbersOnly(event);", :maxlength => 5, :size => 5%></td> 
     <td><%= text_field_tag "invoice[invoice_line_items_attributes][#{index}][amount]", invoice_line_item.amount, :class => 'full', :id => 'total', :readonly => 'readonly', :size => 5%></td> 
      <td><%= link_to image_tag("/images/black_icon/ic_cancel.png"),{:action => :remove_line_item, :index => index}, :remote => true unless index == 0 %></td> 
    </tr> 

和2)tax_line_items:

<tr id="tax_row<%= tax_index %>" valign="top" > 
    <%= hidden_field_tag "invoice[tax_line_items_attributes][#{tax_index}][id]",tax_line_item.id%> 
    <%= hidden_field_tag "invoice[tax_line_items_attributes][#{tax_index}][tax]", tax_line_item.tax, :value => 1 %> 
    <td style="background:#EDF4FF"></td> 
    <td class="ta-right" style="background:#EDF4FF" colspan="2"><label>Add Tax:</label></td> 
    <td class="ta-right" colspan="2" style="background:#EDF4FF"> 
     <%= select_tag "invoice[tax_line_items_attributes][#{tax_index}][account_id]", options_from_collection_for_select(@tax_accounts, :id, :name,:selected => tax_line_item.account_id), :include_blank => true, :class=>"full" %> 
     <!-- <a href="/accounts/new?account_head_id=10" > New item</a> --> 
    </td> 
    <td style="background:#EDF4FF"><%= text_field_tag "invoice[tax_line_items_attributes][#{tax_index}][amount]", tax_line_item.amount, :class => 'full', :id => 'tax', :onkeydown => "return numbersOnly(event);", :size => 5%></td> 
    <td style="background:#EDF4FF"><%= link_to image_tag("/images/black_icon/ic_cancel.png"),{:action => :remove_tax_item, :tax_index => tax_index}, :remote => true %></td> 

</tr> 

我可以輕鬆地添加新的行項目條目,然後編輯它,當他們是沒有稅收的項目。問題是 當他們是在任何條目中創建的稅收項目,然後嘗試編輯此條目,然後我的行項目行出現多個時間例如假設我有一個稅收項目他們一個新行將出現的發票行項目答額外行稅線項目。我認爲這會發生,因爲我已經爲這兩個訂單項使用了一張共同的表格。我這樣做是因爲我必須將兩個訂單項都保存在同一個表中,因爲這兩個帳戶都來自同一個表。 如果有人有正確的答案,我非常感謝。謝謝

回答

1

由於this answer暗示,您需要在此表中添加一個「類型」列來區分發票和稅項。它將從您的代碼中刪除很多複雜的事情,因爲Rails將執行識別哪個記錄屬於公共表中的哪個模型類的工作。

+0

謝謝@薩利爾我已經嘗試過,但正如你所說的類型列我應該嘗試這一個。再次感謝您的幫助 – Ravindra

+0

嗨@Salil我試過這個,但我沒有成功。您是否在發票表或訂單項表 – Ravindra

+0

@ravindra中添加了類型列,對於您關於我所鏈接的上一個問題的答案,解釋瞭如何執行此操作。正如它所說 - 通過在invoice_line_items表中添加類型列,您可以擁有模型繼承,並且同時使用同一個表。這是單表繼承。 – Salil