1

私は複雑な関連付けを行っていますが、次の問題があります

私は2つのモデルを持っています。Custmer_billsとBilling_address、および両方にcustomer_idsが含まれています。1人の顧客には1つの請求先住所があり、1人の顧客には多くの顧客請求書があります。関連付けは以下のとおりです。

 class Customer < ActiveRecord::Base
    has_one :billing_address
    has_many :customer_bills
    end


    class CustomerBill < ActiveRecord::Base
    attr_accessible :customer_id
    belongs_to :billing_address
    belongs_to :customer
    end

    class BillingAddress< ActiveRecord::Base
    attr_accessible :customer_id, :address, :city, :phone_work, :phone_home
    belongs_to :customer
    has_many :customer_bills
    end

現在、この関連付けを使用して、住所、都市、電話番号などの請求先住所の詳細を試し、請求書show.htmlの作成後に表示しています。

請求先住所とcustomer_billにbelongs_toを変更しました。

私は以下を試しました。のshow.html

<% for billing_address in @customer_bill.billing_addresses %>  
    <strong>Billing Address</strong>  
  <%=h billing_address.address%><br/>

    <strong>City</strong>
  <%=h billing_address.city%><br/>
  <% end %>

上記のコードにエラーはありませんが、詳細は表示されません。

このために私は has_and_belongs_to_many協会を持っていました

<%=@bill.address%><br/>

上記は、コントローラーにエラーと対応するコードを与えます

def show
    @customer_bill = CustomerBill.find(params[:id])
    @bill = BillingAddress.find(params[:customer_id])
  end

では、顧客への請求が行われた後、どうすれば顧客の請求先住所の詳細を取得できますか?

ガイダンスを求めています。前もって感謝します。

4

2 に答える 2

1

モデルで指定したリレーションに対応しないビューでリレーションを使用しており、間違ったidパラメーターを使用してデータベースにクエリを実行しています。

  1. CustomerBillありますが:billing_address、ではありません :billing_addresses。ループする必要はありませんshow.html.erb
  2. BillingAddressを使用して誤ってクエリを実行していparams[:customer_id]ます。 findforは、列ではなくBillingAddress列で検索します。:idcustomer_id

これまでに提供した情報に基づくと、@bill以下は間違っており、不要です。

def show
  @customer_bill = CustomerBill.find(params[:id])
  @bill = BillingAddress.find(params[:customer_id])
end

params[:id]がのid値である場合、 `BillingAddressを直接クエリせずにインスタンスからCustomerBillを取得できます。BillingAddressCustomerBill

def show
  @customer_bill = CustomerBill.find(params[:id])
end

# in your view
<%= @customer_bill.billing_address.address %>

また、が1つCustomerBillしかないため、ループの必要はありません。 BillingAddress

<% for billing_address in @customer_bill.billing_addresses %>  
  <strong>Billing Address</strong>  
  <%=h billing_address.address%><br/>

  <strong>City</strong>
  <%=h billing_address.city%><br/>
<% end %>

簡単にすることができます

  <strong>Billing Address</strong>  
  <%=h @customer_bill.billing_address.address%><br/>

  <strong>City</strong>
  <%=h @customer_bill.billing_address.city%><br/>

繰り返しますが、これはすべてあなたが提供した情報に基づいています。ビューでリレーションを使用しようとしている方法は、モデルでリレーションがどのように設定されているかを反映していないため、実行しようとしていることについていくつかの仮定を立てています(たとえば、これを指定したことがないため)のためのshow方法でした)

于 2012-08-14T11:42:43.140 に答える
1

私は上記の答えが好きです。請求先住所フィールドを顧客に単に追加するのではなく、独自のモデルとしてBillingAddressを使用することを主張した場合(これにより、混乱や頭痛の種がなくなります)、これを行うことができます。(これは、上記のコントローラーコードが顧客であると想定しています。コントローラ)

顧客モデル

class Customer < ActiveRecord::Base
has_one :billing_address
has_many :customer_bills
delegate :state, :city, :address, :country, :to => :billing_address
delegate :bill_name, :bill_biller, :more_bill_attributes, :to => :customer_bill
end

カスタマーコントローラー

def show
 @customer = Customer.find(params[:id])
end

カスタマービュー

<%=@customer.state%>
<%=@customer.city%>
<%=@customer.address%>
<%=@customer.country%>
<%=@customer.bill_name%>
<%=@customer.bill_biller%>

など...したがって、「delegate」を使用すると、この場合、属性およびメソッドへの呼び出しを別のクラスに委任できます。

于 2012-08-15T02:35:17.323 に答える