2011-02-07 14 views
9

Powiedzmy, że mam dwa modele, książki i autora o relacji między nimi a has_and_belongs_to_many.HABTM i accepts_nested_attributes_for

Co chcę zrobić, to móc dodać nazwiska autorów w formie książki i po przesłaniu albo połączyć autorów z książką, jeśli już istnieją, albo utworzyć je, jeśli nie.

Chcę również zrobić to samo z formularzem autora: dodać nazwy książek i po przesłaniu albo połączyć je, jeśli istnieją, lub utworzyć je, jeśli nie.

Podczas edycji nie chcę jednak ani edytować, ani usuwać zagnieżdżonych obiektów, a jedynie usuwać powiązania.

Czy akceptuje_nested_attributes_do tego odpowiednie, czy jest inny sposób?

udało mi się to osiągnąć wykonując Complex Forms railscasts on Rails 2, ale szukam bardziej eleganckie rozwiązanie dla Rails 3.

+0

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

Odpowiedz

12

Nie jestem pewien, dlaczego tak wiele osób korzysta has_and_belongs_to_many, który jest relikt z Rails 1, zamiast używać has_many ..., :through z wyjątkiem tego, że prawdopodobnie zawiera wiele starych podręczników i samouczków. Duża różnica między tymi dwoma podejściami polega na tym, że pierwsze wykorzystuje klucz złożony do ich identyfikacji, a drugi - model pierwszej klasy.

Jeśli przedefiniujesz relację, możesz zarządzać na poziomie modelu pośredniego. Na przykład można dodawać i usuwać zapisy BookAuthor zamiast linków has_and_belongs_to_many, które są trudne do zindeksowania indywidualnie.

można stworzyć prosty model:

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

Każdy z twoich innych modeli jest teraz łatwiej powiązać

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 

Na zagnieżdżonego formularza, zarządzać relację book_authors bezpośrednio, dodawanie i usuwanie w razie potrzeby.

+0

Dziękuję. Zastosowałem to podejście i jest ono łatwiejsze do wdrożenia niż cokolwiek innego. – Marjan

+32

Powód, dla którego ludzie używają HABTM ponad has_many: przez to, ponieważ nie każda tabela dołączania wielu do wielu wymaga modelu do zarządzania nią. Często zdarza się, że złożony model danych zawiera wiele tabel łączenia, które nie robią nic poza wyrażeniem relacji między dwiema innymi tabelami. –

+0

Sama nazwa jest wystarczającym powodem, dla którego HABTM umrze, ale są też inne. Po pierwsze, nie możesz użyć 'nested_attributes_for' z HABTM, więc dodawanie lub usuwanie rzeczy za pomocą pól wyboru jest ćwiczeniem frustrującym dla starej metody. Nawet jeśli nie potrzebujesz wszystkich funkcji, które ma do zaoferowania podejście ": through", jeśli istnieje nawet niewielka szansa, że ​​* będziesz *, warto go użyć. Nie mogę wymyślić żadnych powodów, aby używać HABTM specjalnie i nie używałem go od Rails 1.x. – tadman

Powiązane problemy