1

我正在做一个复杂的关联,我有以下问题

我有 2 个模型。Custmer_bills 和 Billing_address 都包含 customer_ids。一位客户有一个帐单地址,一位客户有许多客户账单。关联如下所示。

 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搜索:id而不是customer_id列搜索。

根据您迄今为止提供的信息,@bill以下内容是错误且不必要的。

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

如果params[:id]是 a 的 id 值CustomerBill,则可以BillingAddressCustomerBill实例中获取,而无需直接查询 `BillingAddress.

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

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

此外,由于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 作为自己的模型,而不是简单地将帐单地址字段添加到 Customer(这将消除混乱和头痛),那么您可以这样做..(假设上面的控制器代码是 Customer控制器)

客户模型

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

依此类推...因此,在这种情况下,“委托”将允许您将对属性和方法的调用委托给另一个类。

于 2012-08-15T02:35:17.323 回答