2011-02-06 16 views
19

OK, quindi ecco l'accordo. Ho due tabelle e una tabella di join poiché si tratta di una relazione molti-a-molti. Ho un ordine e un ordine può avere molti prodotti. Ovviamente va dall'altra parte perché i prodotti possono essere su molti ordini. Ho le seguenti classi:Rails 3 has_many: attraverso il problema di denominazione

class Order < ActiveRecord::Base 
    has_many :orders_products 
    has_many :products, :through => :orders_products 
end 

class OrderProduct < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :product 
end 

class Product < ActiveRecord::Base 
    has_many :orders_products 
    has_many :orders, :through => :orders_products 
end 

sto diventando una pagina per visualizzare e sono in grado di entrare roba e quando vado a interagire con i prodotti sul ordine salvato tramite @order.products mi sto il seguente errore:

SQLite3::SQLException: no such table: order_products: SELECT "products".* FROM "products" INNER JOIN "order_products" ON "products".id = "order_products".product_id WHERE (("order_products".order_id = 1)) 

mio unirsi tavolo è chiamato orders_products, ma come si può vedere che sta cercando di unirsi attraverso order_products. La mia conoscenza limitata delle convenzioni di denominazione di Rails mi dice che orders_products è il modo corretto per denominarlo e quindi denominare il mio modello come OrderProduct. Sto davvero battendo la testa contro un muro su questo.

EDIT: Vedo che anche se è stato salvato il mio ordine e ho selezionato più caselle di controllo non ha salvato alcun valore nella tabella orders_products, presumibilmente per lo stesso motivo in cui si sta verificando ora.

risposta

27

orders_products non è la convenzione di denominazione corretta per un rapporto has_many :through - è è corretta per un rapporto has_and_belongs_to_many. In un has_many :through, il modello "join" non è solo per l'adesione, ma è anche il proprio modello che ha i propri dati, ovvero anche per unire altri due modelli.

Se il modello OrderProduct non dispone dei propri dati, della logica o dei vincoli, è possibile utilizzare una relazione has_and_belongs_to_many, rimuovere completamente il modello e quindi la tabella di join viene denominata a destra. In caso contrario, viene denominato in base alle convenzioni di denominazione dei modelli standard, ovvero order_products.

+0

Vedere la [guida per questo argomento] (http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association) per un esempio di un'associazione corretta 'has_many: through'. –

+3

Ah, ho pensato che l'habtm fosse deprecato. – MattC

+0

Tuttavia sembra che abbia risolto il problema, quindi ottieni una stella. Inoltre, 5 punti per una risposta accettata: D – MattC

Problemi correlati