HABTM и accept_nested_attributes_for - PullRequest
       23

HABTM и accept_nested_attributes_for

9 голосов
/ 07 февраля 2011

Скажем, у меня есть две модели, Книга и Автор с отношением has_and_belongs_to_many между ними.

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

Я также хочу сделать то же самое с формой автора: добавить названия книг и при отправке либо связать их, если они существуют, либосоздайте их, если они этого не сделают.

Однако при редактировании я не хочу ни редактировать, ни удалять вложенные объекты, а только удалять ассоциации.

Подходит для этого acceptpts_nested_attributes_for,или есть другой способ?

Мне удалось это сделать, следуя Сложные формы railscasts на Rails 2, но я ищу более элегантное решение для Rails 3.

1 Ответ

12 голосов
/ 07 февраля 2011

Я не уверен, почему так много людей используют has_and_belongs_to_many, который является пережитком Rails 1, вместо использования has_many ..., :through, за исключением того, что это, вероятно, во многих старых справочниках и руководствах.Большая разница между этими двумя подходами заключается в том, что первый использует составной ключ для их идентификации, второй - модель первого класса.

Если вы переопределите свои отношения, вы сможете управлять на уровне промежуточной модели.Например, вы можете добавлять и удалять BookAuthor записей вместо has_and_belongs_to_many ссылок, которые, как известно, трудно настроить индивидуально.

Вы можете создать простую модель:

class BookAuthor < ActiveRecord::Base
  belongs_to :book
  belongs_to :author
end

Каждая из ваших других моделей теперь более легко связана:

class Book < ActiveRecord::Base
  has_many :book_authors
  has_many :authors, :through => :book_authors
end

class Author < ActiveRecord::Base
  has_many :book_authors
  has_many :books, :through => :book_authors
end

В вашей вложенной форме напрямую управляйте отношением book_authors, добавляя и удаляя их по мере необходимости.

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