Rails 3 has_many:通过命名问题

Mat*_*ttC 19 activerecord ruby-on-rails ruby-on-rails-3

好吧,所以这是交易.我有两个表和一个连接表,因为它是一个多对多的关系.我有订单,订单可以有很多产品.显然,它是另一种方式,因为产品可以在许多订单上.我有以下课程:

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
Run Code Online (Sandbox Code Playgroud)

我正在显示一个页面,我可以输入内容,当我通过保存的订单与产品进行交互时,@order.products我收到以下错误:

 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))
Run Code Online (Sandbox Code Playgroud)

我的连接表已命名orders_products,但您可以看到它正在尝试加入order_products.我对Rails命名约定的有限知识告诉我,这orders_products是命名它的正确方法,然后将我的模型命名为OrderProduct.我真的在这个墙上碰到了一堵墙.

编辑:我看到即使它保存了我的订单它我选择了多个复选框它没有保存orders_products表中的任何值,大概是因为它现在错误的原因相同.

Mic*_*ley 27

orders_products不是关系的正确命名约定has_many :through- 它对于关系正确的has_and_belongs_to_many.在a中has_many :through,"join"模型不仅仅用于加入 - 它也是自己的模型,它有自己的数据,也恰好将两个其他模型连接在一起.

如果您的OrderProduct模型没有任何自己的数据,逻辑或约束,那么您可以使用has_and_belongs_to_many关系,完全删除模型,然后将连接表命名为right.否则,它根据常规模型命名约定命名,即order_products.

  • 啊,看,我觉得habtm已被弃用了. (3认同)