@borrower = CompanyBorrower.find(params[:id])
@individuals = @borrower.individuals.all
@roles = @individuals.borrower_individuals.all
Здесь Вы вызываете метод ассоциации на объект ActiveRecordRelation не на объект Active Record .ie Вы вызываете его при сборе ActiveRecords, а не в одной записи. Вам нужновызвать метод ассоциации на одной записи.@individuals = @ loaner.individuals.all
Здесь вы вызвали индивидуумы (метод ассоциации) для одного активного объекта записи (@borrower). Он вернет коллекцию ActiveRecords (объект ActiveRecord_Relation), если записи присутствуют (еслизаписей нет, будет возвращен пустой объект отношения активной записи).В следующей строке вы пытаетесь вызвать заемщик_individuals (метод связи) для объекта отношения записи Rectiveing. Поэтому он выдает ошибку
@roles = @individuals.borrower_individuals.all
, вам нужно переписать код выше
@roles = @individuals.map(&:borrower_individuals).flatten
Как упоминал Марек Липка, это вызовет N + 1 запрос и вернет объект массива.Чтобы избежать запроса N + 1, мы можем изменить его
@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.
, вы можете избежать переменных @individuals и @roles, если собираетесь использовать его на html-странице. Это зависит от того, как вы собираетесьиспользуйте это