Routing corretto per: has_many: attraverso
-
18-09-2019 - |
Domanda
Sto cercando di creare una relazione molti-a-molti tra i 2 oggetti. Ho passato con diversi tutorial e sono stati in grado di impostare correttamente il modello. Il mio problema è che io sto avendo l'impostazione dei percorsi corretti in modo da poter vedere il rapporto completo ... qualcosa di simile visualizzando solo i prodotti da una categoria specifica guai ( / categorie / 1 / prodotti / )
Ecco come ho generato il modello:
script/generate scaffold category name:string
script/generate scaffold product name:string
script/generate scaffold categorization category_id:integer product_id:integer
Ecco lo 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
Ecco gli oggetti 3 del modello:
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
Piuttosto semplice e tutto sembra funzionare bene perché posso aggiungere un prodotto a una categoria attraverso la console:
@category.categorizations << Categorization.new(:product_id => 1)
Sono sicuro che ho bisogno di aggiornare il file routes.rb ma io non so davvero il modo corretto di farlo. Questo è quello che ho messo nel file rotte:
map.resources :categories, :has_many => :products
Quando tento di visualizzare i prodotti su una categoria "/ categorie / 7 / prodotti /" solo elenca tutti i prodotti! Questo significa il mio percorso è corretta e ho solo bisogno di scrivere un'azione personalizzata sul controller prodotti (invece di farlo andare all'indice)? Che cosa sto facendo male qui ... io chiudo o lontano?!?
Grazie
Soluzione
Siete probabilmente non utilizzando i dati del percorso per filtrare l'elenco dei prodotti.
Nel tuo metodo indice del product_controller, è necessario fare qualcosa di simile:
Category.find(params[:category_id]).products
Altri suggerimenti
Che cosa si vuole fare è utilizzare le risorse nidificato. Il formato generale è simile al seguente:
map.resources :users do |users|
users.resources :posts
end
Per saperne di più su di esso qui .
Come proposto in questa domanda , si potrebbe provare ad aggiungere il parametro di richiesta:. category_id alla tua richiesta find
Sempre guardare l'uscita di percorsi rastrello .