通过父模型访问姐妹子的属性
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 Owner
的 first_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
..因此您将获得所有者的活动记录集合,而不是单个对象。
有两种方法可以解决这个问题,
- 遍历集合并获取名称
- 把所有所有者的名字都摘下来,这就是我想你要找的
您必须预加载所有者以避免 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>
所以我一直在寻找,似乎无法找到正确的概念 explanation/technical 过程,而且很可能是错误地接近它。
我有 2 个子模型,由同一个父模型连接,我想从 CHILD A 的索引视图访问 CHILD B 的属性:通过父实例。
高级概述
Property
/ \
Order Owner
基本上我有一个索引页面显示所有打开的 Orders
,每个 Order
必须有一个 Property
(父级)并且每个 Property
都有一个所有者。所以我在 Orders
索引页中,我想查看 Property's Owner
的 first_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
..因此您将获得所有者的活动记录集合,而不是单个对象。
有两种方法可以解决这个问题,
- 遍历集合并获取名称
- 把所有所有者的名字都摘下来,这就是我想你要找的
您必须预加载所有者以避免 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>