通过父模型

时间:2017-06-09 04:00:18

标签: ruby-on-rails ruby ruby-on-rails-5 model-associations

所以我一直在寻找,似乎无法找到正确的概念性解释/技术流程,而且可能很难接近它。

我有2个子模型,由同一个父级连接,我想从CHILD A的索引视图访问CHILD B的属性:THROUGH父项的实例。

高级别概述

    Property
   /        \
Order      Owner  

基本上我有一个索引页面显示所有开放的Orders,每个Order必须有Property(父),每个Property都有一个所有者。所以我在Orders索引页面中,我希望看到first_name的{​​{1}},我该如何访问它?

如果我这样做:

Property's Owner

我收到错误@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
  

1 个答案:

答案 0 :(得分:2)

根据您的模型定义,order多个 owners ..因此您将获得所有者的有效记录集合,而不是单个对象。

有两种方法可以解决这个问题,

  1. 循环收集并获取名称
  2. 采摘所有的所有者名称,我认为您正在寻找
  3. 您必须预加载所有者以避免 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>