Что вызывает эту ошибку в моих ассоциациях Active Record, когда я использую model.collection.build? - PullRequest
0 голосов
/ 02 сентября 2018

В моем проекте у меня есть следующие три класса:

class User < ApplicationRecord
  has_many :portfolios, dependent: :destroy
  has_many :positions, through: :portfolios
end

class Portfolio < ApplicationRecord
  belongs_to :user
  has_many :positions, dependent: :destroy
end 

class Position < ApplicationRecord
  belongs_to :portfolio
end

Когда я пытаюсь построить позицию непосредственно из пользовательской модели (user.positions.build(attributes)), передавая существующий аргумент portfolio_id в качестве одного из атрибутов, я получаю следующую ошибку:

ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection (Cannot modify association 'User#positions' because the source reflection class 'Position' is associated to 'Portfolio' via :has_many.

Почему это случилось? Я чувствую, что здесь есть чему поучиться, но на самом деле я этого не понимаю!

Приложение: Я думаю, что мои ассоциации имеют смысл: портфель должен принадлежать только одному пользователю, позиция - только одному портфелю, а портфель должен иметь несколько позиций, а пользователь - несколько портфелей.

1 Ответ

0 голосов
/ 02 сентября 2018

Вам нужно строить позиции, подобные этой

user = User.first
portfolio_attributes = {name: 'Portfolio_1'}
position_attributes = {name: 'Postion_1'}
user.portfolios.build(portfolio_attributes).positions.build(position_attributes)
user.save!

Когда я запускаю user.positions, я получаю следующий результат

user.positions
  Position Load (0.6ms)  SELECT  "positions".* FROM "positions" INNER JOIN "portfolios" ON "positions"."portfolio_id" = "portfolios"."id" WHERE "portfolios"."user_id" = ? LIMIT ?  [["user_id", nil], ["LIMIT", nil]]
 => #<ActiveRecord::Associations::CollectionProxy [#<Position id: 1, name: "Postion_1", portfolio_id: 1>]> 
...