我有两个表。项目和供应商。项目由供应商销售。所以物品belongs_to:供应商和供应商has_many:物品。这工作正常。Rails 3.1高级Has_many和belongs_to模型连接
但是,物品并不总是由销售他们的厂商制造,但有时他们是。所以我在我的Item表中有一个名为“manufacturer_id”的新列。我试图做一个复杂的has_many和belongs_to来定义制造商,而不是生成一个名为Manufacturer的新模型。
在这里看到:
class Item < ActiveRecord::Base
belongs_to :vendor
belongs_to :manufacturer, :class_name => "Vendor", :foreign_key => "manufacturer_id"
end
class Vendor < ActiveRecord::Base
has_many :items
has_many :manufactured_items, :class_name => "Item", :foreign_key => "manufacturer_id"
end
表工作正常上创建命令的物品填充MANUFACTURER_ID:
Item.create(:manufacturer => Vendor.find_by_abbrev("INV"))
而且我甚至可以得到制造商的操作
item.manufacturer
返回:
<Vendor:0x007ff06684e398>
但是:
item.manufacturer.name
用硬exeption完全失败,我得到的错误:
undefined method `name' for nil:NilClass
运行
debug item.manufacturer
给
--- !ruby/object:Vendor
attributes:
id: 181
name: Invitrogen
website: http://www.invitrogen.com/
created_at: 2012-01-08 01:39:07.486375000Z
updated_at: 2012-01-08 01:39:07.486375000Z
abbrev: INV
因此item.manufacturer.name应该返回上述供应商对象的名称,供应商:0x007ff06684e398。
我在这里做错了什么?
而且,一旦我得到这个工作,我希望能够同样拨打:
vendor.manufactured_items
让所有有供应商的MANUFACTURER_ID的项目。有没有一种简单的方法可以做到这一点?
我最后的努力,可能涉及不必做:
制造商= Vendor.new(item.manufacturer)
但是,这似乎完全错误的,违背了Rails文档浏览: http://guides.rubyonrails.org/association_basics.html#self-joins
请帮忙!
感谢您的输入,但不幸的是这并没有解决我的问题。告诉我谷歌的答案也没有帮助。你有没有看到我上面描述的细节? item.manufacturer返回一个供应商对象,但它不能响应供应商的方法,如名称。 – jmil 2012-01-08 04:41:44
我只是在我的电话中回答这个问题,希望能指出您正确的方向。我将在明天仔细研究这一点并改进我的答案。别担心 - 我还没有完成。 – jefflunt 2012-01-08 05:38:56
好,非常感谢! – jmil 2012-01-08 07:37:40