2012-04-09 5 views
0

Ich frage mich, wie man eine Join-Tabelle articles_categories erstellt, aber eine, wo es nur eine Kategorie pro Artikel geben kann. Ich weiß, dass die typische Art, Kategorien zu erstellen, darin besteht, mehrere Kategorien für jeden Artikel mit has_and_belongs_to_many zuzulassen, aber ich möchte nur eine Kategorie pro Artikel zulassen. Ich habe meine Join-Tabelle articles_categories bereits mit den Verknüpfungen has_and_belongs_to_many eingerichtet. Ich folgte einem Beispiel von Apress Beginning Rails 3, das auch empfohlen hat, die Tabelle articles_categories zu setzen: id => false. Muss ich auch die Tabelle aktualisieren, um eine ID zu haben? Vielen Dank!Schienen 3 Join Tabelle article_categories nur eine Kategorie zulassen

Bisher habe ich meine Artikel Modell aktualisiert has_one: Kategorie und die Kategorie Modell has_many: Artikel, aber ich erhalte eine Fehlermeldung, während in irb Prüfung:

a = Article.first 
a.category 

Der Fehler wird:

Category Load (0.7ms) SELECT "categories".* FROM "categories" WHERE "categories"."article_id" = 1500 LIMIT 1 
PG::Error: ERROR: column categories.article_id does not exist 
LINE 1: SELECT "categories".* FROM "categories" WHERE "categories"... 

Kann mir jemand sagen, wie ich das besser einrichten kann? Vielen Dank!

Antwort

3

Wenn Sie möchten, dass jeder Artikel nur eine Kategorie hat, sollten Sie keine Kreuztabelle verwenden. Verwenden Sie einfach Referenzen in der Migration - http://guides.rubyonrails.org/migrations.html#highlighter_472212

rails g migration ArticleHasCategory category:references 

Dann geben Sie die Artikelkategorie in Modell

belongs_to :category 

Wenn Sie article.category rufen hat. Es wird automatisch nach der Spalte <relation name>_id gesucht, die auf die Aufzeichnung in <relation name>

zeigen sollte
4

Das Article Modell sollte eine belongs_to :category Assoziation anstelle von has_one :category haben. Vergessen Sie auch nicht, eine category_id Spalte zu articles Tabelle hinzuzufügen (Sie können eine Migration für das hinzufügen, wenn Sie nicht bereits haben).

Verwandte Themen