Richtige Routing für: has_many: durch
-
18-09-2019 - |
Frage
Ich versuche, eine Many-to-Many Verbindung zwischen zwei Objekten einzurichten. Ich habe durch einige Tutorials gegangen und konnte richtig das Modell einzurichten. Mein Problem ist, dass ich Probleme habe, die richtigen Routen einrichten, damit ich die volle Beziehung sehen ... so etwas wie nur die Produkte aus einer bestimmten Kategorie angezeigt wird ( / categories / 1 / products / )
Dies ist, wie ich das Modell generiert:
script/generate scaffold category name:string
script/generate scaffold product name:string
script/generate scaffold categorization category_id:integer product_id:integer
Hier ist das Schema:
ActiveRecord::Schema.define(:version => 20100205210519) do
create_table "categories", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "categorizations", :force => true do |t|
t.integer "category_id"
t.integer "product_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "products", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
end
Hier ist die 3 Modellobjekte:
class Category < ActiveRecord::Base
has_many :categorizations
has_many :products, :through => :categorizations
end
class Product < ActiveRecord::Base
has_many :categorizations
has_many :categories, :through => :categorizations
end
class Categorization < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
Ganz einfach und alles scheint in Ordnung zu arbeiten, weil ich einen Artikel in eine Kategorie über die Konsole hinzufügen:
@category.categorizations << Categorization.new(:product_id => 1)
Ich bin sicher, ich brauche die routes.rb Datei zu aktualisieren, aber ich weiß nicht wirklich den richtigen Weg, es zu tun. Dies ist, was ich in der Routen-Datei setzen:
map.resources :categories, :has_many => :products
Wenn ich versuche, Produkte auf eine Kategorie, um „/ categories / 7 / products /“ es nur alle Produkte aufgeführt! Bedeutet dies, mein Weg richtig eingestellt ist und ich brauche nur eine benutzerdefinierte Aktion auf die Produkte Controller zu schreiben (statt es zu indizieren gehen)? Was mache ich falsch hier tun ... Ich bin in der Nähe oder weg?!?
Danke
Lösung
Sie sind wahrscheinlich nicht die Daten von der Strecke mit der Liste der Produkte zu filtern.
In Ihrer Index-Methode des product_controller, müssen Sie etwas tun, wie:
Category.find(params[:category_id]).products
Andere Tipps
Was Sie tun möchten, ist die Verwendung verschachtelt Ressourcen. Das allgemeine Format sieht wie folgt aus:
map.resources :users do |users|
users.resources :posts
end
Lesen Sie mehr dazu hier .