Рубин на рельсах

Я делаю сложную ассоциацию, и у меня следующая проблема

у меня 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, т.е.

я пробовал следующее. в 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 ассоциаций и

<%[email protected]%><br/>

и приведенное выше дает ошибку и соответствующий код в контроллере

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

Итак, как я могу получить данные платежного адреса клиента после того, как он будет выставлен?

Ищу руководства. Заранее спасибо.


person deeraj    schedule 14.08.2012    source источник


Ответы (2)


Вы используете в своем представлении отношения, которые не соответствуют отношениям, которые вы указали в своих моделях, и запрашиваете базу данных с использованием неправильных параметров id.

  1. CustomerBill имеет :billing_address, нет :billing_addresses. Нет необходимости в петле в show.html.erb
  2. Вы неправильно запрашиваете BillingAddress, используя params[:customer_id]. find для BillingAddress будет искать по столбцу :id, а не по столбцу customer_id.

Судя по информации, которую вы предоставили до сих пор, @bill ниже неверно и ненужно.

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

Если params[:id] является значением идентификатора CustomerBill, вы можете получить BillingAddress из экземпляра CustomerBill без прямого запроса `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 метод).

person deefour    schedule 14.08.2012
comment
Мне очень жаль, что я не совсем понял суть проблемы. Я хотел получить данные платежного адреса клиента после создания счета. поскольку bill и bill_address имеют общее поле customer_id. Я думал, что могу получить адрес выставления счета, город и т. д., сравнивая customer_id bill и bill_address. Это то, что я пытаюсь сделать. Поскольку между bill_address и bill нет прямой связи, я добавил ассоциацию, чтобы получить подробную информацию об этом конкретном клиенте. Надеюсь, я ясно. - person deeraj; 16.08.2012
comment
Дело в том, что CustomerBill имеет связанный с ним :billing_address, так что вы можете просто использовать его напрямую. Если вы хотите получить BillingAddress из Customer, владеющего CustomerBill, вы можете просто сделать @customer_bill.customer.billing_address. Нет необходимости сравнивать идентификаторы клиентов со всем, что я видел до сих пор. - person deefour; 16.08.2012
comment
хорошо, я не знал, что мы можем использовать @ customer_bill.customer.billing_address. Поднимите палец вверх за ответ. :) - person deeraj; 17.08.2012

Мне нравится ответ выше. Если вы настаивали на использовании 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

Мнение клиентов

<%[email protected]%>
<%[email protected]%>
<%[email protected]%>
<%[email protected]%>
<%[email protected]_name%>
<%[email protected]_biller%>

и так далее ... В этом случае «делегат» позволит вам делегировать вызовы атрибутов и методов другому классу.

person n0denine    schedule 15.08.2012
comment
Спасибо, что поделились этим ответом, я не думал об использовании опции delegate. и для ясности я хочу, чтобы сведения о клиенте были указаны в адресе выставления счета в представлении «Счет клиента», а не в представлении «Клиент». поэтому, основываясь на вашем ответе, я попытался это сделать. и я не получаю желаемого результата. осветить этот вопрос было бы хорошо. Я разместил ссылку в следующем комментарии :) Еще раз спасибо :) - person deeraj; 16.08.2012
comment
pastebin.com/QrL3yxfw и просто для ясности, можем ли мы использовать делегат по какому-либо условию ??? вроде delegate :find_by_customer_id или что-то подобное ?. Я просмотрел несколько блогов о делегате, и ничего подобного не было сказано о делегате с условием. - person deeraj; 16.08.2012
comment
Я понял. Спасибо и плюс 1 за ответ. :) - person deeraj; 17.08.2012