簡體   English   中英

通過父模型訪問姐妹孩子的屬性

[英]Access the attributes of a sister child via the parent model

因此,我一直到處尋找,似乎無法為此找到正確的概念解釋/技術過程,並且很可能會錯誤地使用它。

我有2個子模型,由同一父模型連接,我想從CHILD A的索引視圖訪問CHILD B的屬性:通過父模型的實例。

高層概述

    Property
   /        \
Order      Owner  

基本上,我有一個索引頁面,顯示所有未結Orders ,每個Order必須有一個Property (父對象),每個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'

結束

^注釋掉了我正在嘗試但無法正常工作的東西,包括它,以防我在某處有點距離。

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>

根據您的模型定義,一個order具有多個 owners因此,您將獲得所有者的有效記錄集合,而不是單個對象。

有兩種處理方法,

  1. 遍歷集合並獲取名稱
  2. 摘下所有所有者的名字,這是我認為您正在尋找的

您必須預先加載所有者,以避免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主人的,你可以在你定義一個方法owner.rb作為

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

在您看來

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM