通过父模型访问姐妹子的属性

Access the attributes of a sister child via the parent model

所以我一直在寻找,似乎无法找到正确的概念 explanation/technical 过程,而且很可能是错误地接近它。

我有 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>