首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >#<Individual::ActiveRecord_AssociationRelation:0x000000000dc58660>的NoMethodError -未定义方法`borrower_individuals‘

#<Individual::ActiveRecord_AssociationRelation:0x000000000dc58660>的NoMethodError -未定义方法`borrower_individuals‘
EN

Stack Overflow用户
提问于 2018-10-22 11:36:14
回答 2查看 528关注 0票数 0

我不明白为什么这不起作用

模型

代码语言:javascript
复制
class CompanyBorrower < ApplicationRecord
    has_many :borrower_individuals
    has_many :individuals, -> { distinct }, :through => :borrower_individuals
end

class BorrowerIndividual < ApplicationRecord
    belongs_to :company_borrower, optional: true
    belongs_to :individual, optional: true
end

class Individual < ApplicationRecord
    has_many :borrower_individuals
    has_many :company_borrowers, :through => :borrower_individuals
end

控制器

代码语言:javascript
复制
@borrower = CompanyBorrower.find(params[:id])
@individuals = @borrower.individuals.all
@roles = @individuals.borrower_individuals.all

和我得到了错误.

代码语言:javascript
复制
undefined method `borrower_individuals' for #<Individual::ActiveRecord_AssociationRelation:0x000000000dc58660>

错误发生在@roles上--如果我删除,错误将消失。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-22 11:59:23

代码语言:javascript
复制
@borrower = CompanyBorrower.find(params[:id])
@individuals = @borrower.individuals.all
@roles = @individuals.borrower_individuals.all

这里您正在调用上的关联方法,ActiveRecordRelation对象,,而不是活动记录对象.i.e,您是在ActiveRecords上调用它,而不是在单一record.You上,需要调用单个记录上的关联方法。@individuals = @borrower.individuals.all

在这里,您已经调用了单个活动记录对象(@借款人)上的不可分割(关联方法),如果存在记录,.It将返回ActiveRecords (ActiveRecord_Relation对象)的合集(如果记录不存在,它将返回空的活动记录关系对象)。在下一行中,您正在尝试调用rective record关系对象上的borrower_individuals(关联方法)。

代码语言:javascript
复制
@roles = @individuals.borrower_individuals.all

您需要重写上面的代码

代码语言:javascript
复制
@roles = @individuals.map(&:borrower_individuals).flatten

正如Marek所提到的,它将导致N+1查询并返回数组对象。为了避免N+1查询,我们可以更改它

代码语言:javascript
复制
@borrower = CompanyBorrower.find(params[:id])
@individuals = @borrower.individuals.all
@roles = @individuals.borrower_individuals.all

@borrower = CompanyBorrower.includes(individuals: [:borrower_individuals]).find(params[:id])
@individuals = @borrower.individuals.all
@roles = @individuals.map(&:borrower_individuals).flatten # will return array object.

如果要在html page.It中使用@page.It和@roles变量,则可以避免使用它,这取决于您将如何使用它。

票数 1
EN

Stack Overflow用户

发布于 2018-10-22 11:45:20

@individual不包含单个Individual实例,而是包含Relation,显然不能在该实例方法上调用Individual实例方法。您可以以稍微不同的方式设置您的@roles,例如:

代码语言:javascript
复制
@roles = BorrowerIndividual.where(individual_id: @individuals.pluck(:id))

但老实说,我不知道这在你的情况下是否必要,因为在我看来,你试图用有点过于复杂的方式来解决相当简单的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52928428

复制
相关文章

相似问题

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