2017-06-09 9 views
1

私はこれまでのことをすべて見てきましたが、正しい概念的な説明や技術的なプロセスが見つからないようで、間違っている可能性があります。親モデルを介して姉妹の属性にアクセス

同じ親によって接続された2つの子モデルがあります。親のインスタンスを介して、子供のインデックスビューから子供Bの属性にアクセスしたいと思います。

ハイレベルな概要

Property 
/  \ 
Order  Owner 

基本的に私は、開いているすべてのOrdersを示すインデックスページを持って、各OrderProperty(親)を持っている必要があり、すべてのPropertyは、所有者を持っています。だから私はOrdersインデックスページにあり、Property's Ownerfirst_nameを見たいのですが、どうすればそれにアクセスできますか?

私はのような何かを行う場合は、次の

@order.property.owners.first_name 

を、私は私が行うがあれば、エラーundefined methodを得る:

@order.property.owners 

私はエラーが表示されるのではなくはありません:

#<Owner::ActiveRecord_Associations_CollectionProxy:0x007f8a85368988> 

が他のすべての正しい情報と共に私の見解に現れます。

モデル

Property 
has_many :orders 
has_many :owners 
accepts_nested_attributes_for :owners 

Owner 
belongs_to :property 

Orders 
belongs_to :property 
has_many :owners, through: :property 
accepts_nested_attributes_for :owners 

受注コントローラ

def open_orders 
@open_orders = Order.where(status: "Open").paginate(page: params[:page], per_page: 15) 
###@orders = Order.all 
###@properties = Property.find(@orders.property.id) 
###@owners = Owner.find(@properties.owners.id) 
render 'orders/open' 

終わり、私はちょうどAようとしていたが、働いていなかった、包み、それを含めたものをコメントアウト

^どこかでちょっと離れた。お使いのモデルの定義に従って

Open_ordersビュー

<% @open_orders.each do |order| %> 
    <tr> 
    <td><%= order.client_id %></td> 
    <td><%= order.order_number %></td> 
    <td><%= order.property.address1 %></td> 
    <td><%= order.property.owners %></td> 
    <td><%= order.order_update ? "Yes" : "No" %></td> 
    <td><%= order.status %></td> 
    <td><%= order.task %></td> 
    <td><%= order.created_at %></td> 
    <td><%= link_to fa_icon("edit"), edit_property_order_path(order, order.property.id), class: "m-r-xs", remote: true, data: { 'data-toggle' => "modal", 'data-target' => '#orders-modal'} %></td> 
    </tr> 

答えて

2

orderはあなたが所有者の積極的なレコードコレクションの代わりに、単一のオブジェクトを取得している複数owners ..thusを持っています。

あり、これを処理するための2通りの方法がループコレクションを

  1. 、であり、名前
  2. Pluckの私はあなたがあなたが

を探していると思うされ、すべての所有者名を取得所有者を事前にロードする必要があります。n +1クエリ

コントローラ内

あなたのビューで
@open_orders = Order.where(status: "Open").includes(:owners).paginate(page: params[:page], per_page: 15) 

<td><%= order.owners.pluck(:first_name).join(',') %></td> 

更新

所有者のfull_nameを取得するには、あなたはあなたのビューで

def full_name 
    "#{first_name} #{last_name}" 
end 

としてあなたowner.rbでメソッドを定義することができます

<td><%= order.owners.map(&:full_name).join(',') %></td> 
+0

これはかなりおかげさまでした。もう一度@Mdに感謝します。ファハンメモン! 唯一のことは、First_nameとLast_nameが2つの別々のフィールドにあることです。複数の所有者がある場合は、すべてをカンマでジョインします。 'order.owners.pluck([:first_name1、:last_name1]、[: first_name2、:last_name2])。join( '、') 'それらをまとめてみようと思っていますか?それ以外は、あなたの答えはまさに私が探していたものでした! –

+1

アップデートを確認してください:) –

+0

ああ、もちろん!それを考えなかったが、あなたがそれを言ったので、それは全然意味をなさない。もう一度ありがとう、本当に感謝します! –

関連する問題