Как сохранить 2 идентификатора в объединенной таблице для отношений «многие ко многим» в рельсах 3.1 - PullRequest
1 голос
/ 05 января 2012

Есть две модели.Один - это rfq, а другой - стандартный.Это как:

class Rfq << ActiveRecord::Base
  has_and_belongs_to_many :standards
end

class Standard << ActiveRecord::Base
  has_and_belongs_to_many :rfqs
end

Таблица rfqs_standards была создана.У меня вопрос при создании rfq, как автоматически сохранить оплаченные rfq_id и standard_id в таблице rfqs_standards.

Мысли добавим accepts_nested_attributes_for :standard в модель rfq.Однако, поскольку для этого отношения «многие ко многим» не сохраняются реальные атрибуты (а просто пара идентификаторов), этот путь кажется неправильным.

Как rfq, так и standard были объявлены в route.rb как resources :rfqs и resources :standards.

Процедура заключается в том, что при создании rfq стандарт будет выбран из выпадающего списка.Затем rfq сохраняется и в то же время создается новая запись в объединенной таблице.При создании нового стандарта нет необходимости создавать запись в объединенной таблице.

Есть предложения сохранить идентификатор в объединенной таблице?Спасибо.

1 Ответ

1 голос
/ 05 января 2012

это проще, чем вы думаете, потому что это автоматически обрабатывается ActiveRecord.

Когда вы говорите «has_and_belongs_to_many», вы говорите AR связать эти две модели с отношением «многие ко многим», используя таблицу, и по большей части вам больше не нужно беспокоиться о таблице соединения. Когда вы добавите экземпляр Standard в список стандартов Rfq, это будет сделано для вас.

Вот пример:

rfq = Rfq.create
standard = Standard.create
rfq.standards << standard

Мы создали каждый из объектов, а третья строка создает соединение, сохраняя новую запись в таблице rfqs_standards с соответствующими идентификаторами. rqf.standards выглядит и действует как обычный массив, но когда вы назначаете ему объекты, ActiveRecord выполняет работу базы данных за вас.

После создания записей вы могли бы также сделать:

standard.rfqs << rfq

Вы также можете сделать оба одновременно:

rfq = Rfq.create
standard rfq.standards.create

Это создало rfq, затем создал стандарт, который автоматически подключен к rfq. Вы можете сделать то же самое в обратном порядке:

standard = Standard.create
rfq = standard.rfqs.create

Надеюсь, это поможет!

ОБНОВЛЕНИЕ: Поскольку вы упомянули формы и автоматическое сохранение, прочтите мою статью о вложенных атрибутах , в которой показано, как это реализовать, включая полные примеры кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...