所以我一直在寻找,似乎无法找到正确的概念性解释/技术流程,而且可能很难接近它。
我有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
答案 0 :(得分:2)
根据您的模型定义,order
有多个 owners
..因此您将获得所有者的有效记录集合,而不是单个对象。
有两种方法可以解决这个问题,
您必须预加载所有者以避免 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>