Rails使用下划线模拟多对多名称约定

时间:2013-06-10 11:07:37

标签: ruby-on-rails rails-models

我有3张桌子(产品,订单,产品订单) 我有3个模型文件(product.rb,order.rb,product_order.rb)

因此有3个班级

class Product < ActiveRecord::Base
  attr_accessible ...
    has_many :product_orders
    has_many :orders, :through => :product_orders
end

class Order < ActiveRecord::Base
  attr_accessible ...
    has_many :product_orders
    has_many :products, :through => :product_orders
end

class ProductOrder < ActiveRecord::Base
  attr_accessible :order_id, :product_id, ...
    belongs_to :product
    belongs_to :order
end

第一个问题..我可以在products_orders表中使用主键(id)而没有问题吗?我在这里阅读http://guides.rubyonrails.org/association_basics.html关于一些可能的问题,但我不确定。

第二个问题..如果我尝试生成ER图(rake erd),它告诉我:

警告:忽略无效模型ProductOrder(表product_orders不存在)

#缺少的's'是我不知道如何解决的问题(我只想拥有那个下划线模型,因为我认为模型名称与表名不同) < / p>

警告:忽略无效关联:订单上的product_orders(模型ProductOrder存在,但未包含在域中)

警告:忽略无效关联:产品上的product_orders(型号ProductOrder存在,但未包含在域中)

请帮助,这是我的第一个测试应用程序

2 个答案:

答案 0 :(得分:2)

ProductOrders模型的表格名称是什么,如果不是product_orders,Rails是如何知道在哪里看的?

修复您的表名或模型名称以使其符合约定,或使用self.table_name = ...显式指定表名。

此外,通常人们没有为这种关联定义模型,他们使用has_and_belongs_to_many。这是除非需要将额外信息与关联一起存储。

答案 1 :(得分:1)

您好,感谢您的帮助,

class ProductsOrder < ActiveRecord::Base
  set_table_name "products_orders"

是一个解决方案