2011-02-06 14 views
19

Bien, este es el trato. Tengo dos tablas y una tabla de unión ya que es una relación de muchos a muchos. Tengo un pedido y un pedido puede tener muchos productos. Obviamente, va en sentido contrario ya que los productos pueden tener muchos pedidos. Tengo las siguientes clases:Rails 3 has_many: a través del problema de nomenclatura

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 

que estoy recibiendo una página para mostrar y que soy capaz de entrar en la materia y cuando voy a interactuar con los productos en el pedido guardado a través de @order.products estoy recibiendo el siguiente error:

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)) 

Mi unirse tabla se denomina orders_products, pero como se puede ver que está tratando de unirse a través de order_products. Mi conocimiento limitado de las convenciones de nomenclatura de Rails me dice que orders_products es la manera correcta de nombrarlo, y luego nombro mi modelo como OrderProduct. Realmente estoy golpeando mi cabeza contra la pared en este caso.

EDITAR: Veo que, aunque guardó mi pedido y seleccioné varias casillas de verificación, no guardó ningún valor en la tabla orders_products, presumiblemente por la misma razón que está cometiendo un error ahora.

Respuesta

27

orders_products no es la convención de nomenclatura correcta para una relación has_many :through - que es correcta para una relación has_and_belongs_to_many. En un has_many :through, el modelo "unirse" no es solo para unir - también es su propio modelo que tiene sus propios datos, que también ocurre para unir otros dos modelos.

Si su modelo OrderProduct no tiene ninguno de sus propios datos, lógica o restricciones, entonces podría usar una relación has_and_belongs_to_many en su lugar, eliminar el modelo por completo, y luego su tabla de unión se llama derecha. De lo contrario, se nombra de acuerdo con las convenciones de nomenclatura de modelos regulares, es decir, order_products.

+0

Consulte la [guía de este tema] (http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association) para ver un ejemplo de una asociación 'has_many: through' adecuada. –

+3

Ah, mira, pensé que Habtm estaba en desuso. – MattC

+0

Sin embargo, parece que ha solucionado mi problema, por lo que obtienes una estrella. Además, 5 puntos por una respuesta aceptada: D – MattC

Cuestiones relacionadas