ruby-on-rails - Rails 3 has_many :through naming issue

标签 ruby-on-rails ruby-on-rails-3 activerecord

好吧,这就是交易。我有两个表和一个连接表,因为它是多对多关系。我有一个订单,一个订单可以有很多产品。显然它是另一种方式,因为产品可以有很多订单。我有以下类(class):

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

我正在显示一个页面,我可以输入内容,当我通过 @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))

我的连接表名为 orders_products ,但正如您所见,它正在尝试通过 order_products 加入.我对 Rails 命名约定的有限了解告诉我 orders_products是正确的命名方式,然后将我的模型命名为OrderProduct .我真的把头撞在墙上了。

编辑:我看到即使它保存了我的订单并且我选择了多个复选框,它也没有在 orders_products 中保存任何值表,大概与它现在出错的原因相同。

最佳答案

orders_products不是 has_many :through 的正确命名约定关系——对于 has_and_belongs_to_many 是正确的关系。在 has_many :through ,“join”模型不仅仅是为了join——它也是拥有自己数据的自己的模型,它也恰好将其他两个模型连接在一起。

如果您的 OrderProduct模型没有任何自己的数据、逻辑或约束,那么您可以使用 has_and_belongs_to_many关系,而是完全删除模型,然后您的连接表命名正确。否则,按照常规模型命名约定命名,即 order_products .

关于ruby-on-rails - Rails 3 has_many :through naming issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4911852/

相关文章:

activerecord - Yii 2 : how to build search query using ActiveRecord between 2 tables?

ruby-on-rails - 如果 Controller 中没有操作,rails 如何执行 View ?

ruby-on-rails - 如何向 has_many 关联添加更有意义的错误消息?

ruby-on-rails-3 - 在 Heroku 中的 2 个应用程序之间共享数据库

ruby-on-rails - 如何将多个设备型号重定向到多个特定网址?

ruby-on-rails - 指定要从 Rails 查询结果中排除的字段

ruby-on-rails - 为什么应该将 "hard"部署到生产环境中才能部署Ruby on Rails?

ruby-on-rails - RSpec的should_receive和should_not_receive都通过了异常传递

ruby-on-rails - Rails : validate presence of foo unless bar == 'baz'

ruby-on-rails - 使用 SQL 条件 IN 时 ActiveRecord 查找器中的奇怪行为