2011-02-07 6 views
9

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

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

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

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

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

мне удалось сделать это, следуя Complex Forms Railscasts на Rails 2, но я ищу более элегантное решение для Rails 3.

+0

http://stackoverflow.com/a/12961298/1446551 –

ответ

12

Я не знаю, почему так много людей используют 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 отношения напрямую, добавление и удаление при необходимости.

+0

Спасибо. Я использовал этот подход, и его намного проще реализовать, чем что-либо еще. – Marjan

+32

Причина, по которой люди используют HABTM над has_many: через это потому, что не для каждой таблицы соединений «многие-ко-многим» требуется модель для управления ею. Нередко для сложной модели данных есть много таблиц соединений, которые ничего не делают, кроме выражения связи между двумя другими таблицами. –

+0

Только имя - причина, по которой HABTM умирает, но есть и другие. Во-первых, вы не можете использовать 'nested_attributes_for' с HABTM, поэтому добавление или удаление вещей с помощью флажков - это упражнение в расстройстве старого метода. Даже если вам не нужны все функции, которые может предложить метод ': through', если есть даже небольшой шанс, что вы * будете *, это стоит использовать. Я не могу придумать никаких причин использовать HABTM специально и не использовал его с Rails 1.x. – tadman

Смежные вопросы