首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过父模型访问姐妹子的属性

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

Stack Overflow用户
提问于 2017-06-09 04:00:17
回答 1查看 112关注 0票数 1

因此,我一直在寻找,似乎找不到正确的概念解释/技术过程,很可能是不正确地接近它。

我有两个子模型,由同一个父模型连接,我想从子A的索引视图中访问子B的属性:通过父模型的一个实例。

高级概述

代码语言:javascript
复制
    Property
   /        \
Order      Owner  

基本上,我有一个索引页面,显示所有打开的Orders,每个Order必须有一个Property(父),每个Property都有一个所有者。所以我在Orders索引页面中,我想看到first_name of the Property's Owner,我如何访问它?

如果我做这样的事:

代码语言:javascript
复制
@order.property.owners.first_name

我得到了一个错误undefined method,但是如果我这样做了:

代码语言:javascript
复制
@order.property.owners

我没有收到错误,而是:

代码语言:javascript
复制
    #<Owner::ActiveRecord_Associations_CollectionProxy:0x007f8a85368988>

在我看来,还有其他所有正确的信息。

模型

代码语言:javascript
复制
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

订单控制器

代码语言:javascript
复制
  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 View

代码语言:javascript
复制
<% @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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-09 04:12:25

根据您的模型定义,order有多个owners..thus,您将得到所有者的活动记录集合,而不是单个对象。

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

  1. 循环遍历集合并获取名称
  2. 把所有人的名字都取下来,我想你是在找

必须预加载所有者以避免n+1查询

在你的控制器里

代码语言:javascript
复制
@open_orders = Order.where(status: "Open").includes(:owners).paginate(page: params[:page], per_page: 15)

在你看来

代码语言:javascript
复制
<td><%= order.owners.pluck(:first_name).join(',') %></td>

更新

要获得所有者的full_name,可以将owner.rb中的方法定义为

代码语言:javascript
复制
def full_name
  "#{first_name} #{last_name}"
end

在你看来

代码语言:javascript
复制
<td><%= order.owners.map(&:full_name).join(',') %></td>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44449084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档