Rails — проблема в has_many через вложенные атрибуты

У меня проблема с сохранением has_many через отношение с вложенными атрибутами. Из-за сложности и требований в приложении соотношение выглядит следующим образом

Структура таблицы,

agreements:
  id

agreement_rooms:
  id
  agreement_id
  room_id

details:
  id
  agreement_rooms_id

Для большего пояснения: таблица соглашение_комнат связана со многими другими моделями, в которых будет соглашение_комнат_ид.

ассоциации рельсов,

class Agreement < ActiveRecord::Base
  has_many :details,:through => :agreement_rooms
  accepts_nested_attributes_for :details
end

class AgreementRoom < ActiveRecord::Base
  has_many :details
end

class Detail < ActiveRecord::Base
  belongs_to :agreement_room
  accepts_nested_attributes_for :agreement_room
end

Когда я пытаюсь создать запись соглашения с хэшем деталей, я получаю следующую ошибку:

Agreement.last.details.create()

ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection: Cannot modify association 'agreement#details' because the source reflection class 'Detail' is associated to 'agreementRoom' via :has_many.

Я не уверен, как заставить этот вложенный атрибут работать с has_many через отношение для приведенного выше примера. Пожалуйста, помогите разобраться в проблеме.

Заранее спасибо.


person max    schedule 17.12.2015    source источник


Ответы (3)


вам нужно определить обе ассоциации:

class Agreement < ActiveRecord::Base
  has_and_belongs_to_many :agreement_rooms # or has_many if you prefer
  has_many :details,:through => :agreement_rooms
  accepts_nested_attributes_for :details
end

проверьте документацию

person Grzegorz    schedule 17.12.2015

Как я уже говорил ранее, дизайн ассоциации моделей, который у нас есть, был неправильным, и из-за плохого обслуживания он должен быть таким же, по крайней мере, на данный момент. Поэтому мне пришлось написать грязный патч, чтобы исправить это.

Он просто пропускает вложенные атрибуты только для этой конкретной модели, поэтому его можно сохранить отдельно, передав идентификатор основной записи в эту запись.

Поскольку это грязное решение, я не отмечаю его как ответ. Просто добавил его, надеясь, что кто-то может найти решение, если это необходимо.

Спасибо за помощь

person max    schedule 03.01.2016

person    schedule
comment
Это решение не сработало для меня, потому что моя ассоциация нарушала стандарты has_many. Но для правильного has_many через ассоциацию это решение будет работать. - person max; 03.01.2016