2012-03-28 33 views
2

我正面臨新的情況。我知道有人肯定遇到過這種情況:有效記錄has_many關聯一個模型有兩種類型的值

我有一張發票表和一張invoice_line_items表。直到現在,每件事情都與has_many進行得很好,屬於關聯。現在我想在發票項目加稅佔,對於我不希望創建一個單獨的表,因此,我對我做的發票模型的變化如下:

invoice.rb:

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 

    #validations 
     validates_presence_of :invoice_line_items 
    validates_associated :invoice_line_items 
end 

invoice_line_item .RB:

class InvoiceLineItem < ActiveRecord::Base 
    belongs_to :invoice 
    end 

,並在我的控制器我所做的:

class InvoicesController < ApplicationController 
def new 

    @invoice = Invoice.new 

     @invoice.invoice_line_items.build 
    @invoice.tax_line_items.create 

     @from_accounts = TransactionType.fetch_from_accounts(current_company.id,'sales') 
     @to_accounts = TransactionType.fetch_to_accounts(current_company.id, 'sales') 
    @tax_accounts = TransactionType.fetch_from_accounts(current_company.id, 'tax') 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @invoice } 
    end 
    end 
end 
在我的形式,我沒有

: 稅收佔

<% @invoice.invoice_line_items.each_with_index do |invoice_line_item, tax_index| %> 
          <%= render "tax_line_items", :invoice_line_item => invoice_line_item, :index => tax_index %>  
        <% end %> 

和發票項目:

<% @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 %> 

,這裏是我的諧音: 1)_invoice_line_items.html.erb:

<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",:rows =>2 %></td> 
     <td><%= text_field_tag "invoice[invoice_line_items_attributes][#{index}][quantity]",invoice_line_item.quantity, :class => 'amount', :id => 'quantity', :onkeydown => "return numbersOnly(event);", :size => 8, :maxlength => 25 %></td> 
     <td><%= text_field_tag "invoice[invoice_line_items_attributes][#{index}][unit_rate]",invoice_line_item.unit_rate, :class => 'amount', :id => 'unit_cost', :onkeydown => "return numbersOnly(event);", :size => 8, :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 => 'amount', :id => 'discount', :onkeydown => "return numbersOnly(event);", :maxlength => 5, :size => 8%></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 'Remove',{:action => :remove_line_item, :index => index}, :remote => true unless index == 0 %></td> 
    </tr> 

2)_tax_line_items.html .erb:

<tr id="tax_row<%= tax_index %>" valign="top" > 
    <%= hidden_field_tag "invoice[tax_line_items_attributes][#{tax_index}][id]",invoice_line_item.id%> 
    <td></td> 
    <td colspan="2" class="ta-right"><label>Add Tax:</label></td> 
    <td class="ta-right" colspan="2" style="background:#EDF4FF"> 
     <%= select_tag "invoice[invoice_line_items_attributes][#{tax_index}][account_id]", options_from_collection_for_select(@tax_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 style="background:#EDF4FF"><%= text_field_tag "invoice[invoice_line_items_attributes][#{tax_index}][amount]", invoice_line_item.amount, :class => 'full', :id => 'tax', :onkeydown => "return numbersOnly(event);", :size => 5%></td> 
    <td><%= link_to 'Remove',{:action => :remove_tax_item, :index => tax_index}, :remote => true %></td> 
</tr> 

我的座右銘是保存在invoice_line_items表的ACCOUNT_ID列兩個項目賬戶和納稅賬戶,我希望有哥們有答案,在此先感謝

回答

2

你已經是@invoice.invoice_line_items@invoice.tax_line_items會因爲它們都返回相同的價值觀問題正在使用相同的ID加入。

好像你可以使用Single Table Inheritance(你將不得不向下滾動以找到API中的部分)。使用invoice_line_items表中的類型列,您可以擁有模型繼承。

class InvoiceLineItem < ActiveRecord::Base 
    belongs_to :invoice 
end 

class TaxLineItem < InvoiceLineItem 
    belongs_to :invoice 
end 

那麼你可以清理你發票

class Invoice < ActiveRecord::Base 
    has_many :invoice_line_items 
    has_many :tax_line_items, :dependent => :destroy 
end 
+0

感謝@mguymon,但在這裏我只能使用一個表invoice_line_items – Ravindra 2012-03-28 12:59:10

+0

謝謝@mguymon我得到了解決方案,下面是我的答案,非常感謝 – Ravindra 2012-04-16 06:55:09

0

我得到了解決任何關聯,我怎麼做:

<% @invoice.tax_line_items.each_with_index do |tax_line_item, tax_index| %> 
          <%= render "tax_line_items", :tax_line_item => tax_line_item, :index => tax_index %>  
        <% end %> 

,並在部分_tax_line_items的:

<tr id="tax_row<%= tax_index %>" valign="top" > 
    <%= hidden_field_tag "invoice[tax_line_items_attributes][#{tax_index}][id]",invoice_line_item.id%> 
    <td></td> 
    <td colspan="2" class="ta-right"><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 => invoice_line_item.account_id), :include_blank => true, :class=>"full" %> 

    </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><%= link_to 'Remove',{:action => :remove_tax_item, :index => tax_index}, :remote => true %></td> 
</tr> 

這是我的工作....

相關問題