私は2つのテーブルを持っています。アイテム、およびベンダー。アイテムはベンダーによって販売されています。したがって、アイテムbelongs_to:ベンダーおよびベンダーhas_many:アイテム。それはうまく動作します。Rails 3.1高度なHas_manyとbelongs_toモデルの結合
ただし、商品を販売するベンダーによって商品が製造されるとは限りません。だから私は "manufacturer_id"と呼ばれる私のアイテムテーブルに新しい列を持っています。ベンダーを同じように複製するManufacturerという新しいモデルを生成するのではなく、has_manyとbelongs_toの複合体を作成して製造元を定義しようとしました。
こちらを参照してください:作成したコマンドで期待どおりの項目テーブルにMANUFACTURER_IDを移植
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
作品:
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
0123を与えます
したがって、item.manufacturer.nameは、上記のベンダーオブジェクトの名前(Vendor:0x007ff06684e398)を返す必要があります。
私はここで間違っていますか?
vendor.manufactured_items
をそのベンダーのMANUFACTURER_IDを持つすべてのアイテムを取得するために:私はこの作業を取得後
また、私は同様に呼び出すことができるようにしたいと思います。あまりにも簡単な方法がありますか?
私の土壇場の努力を行うに持つ伴うことがあります。
メーカー= Vendor.new(item.manufacturer)
しかし、それは完全に間違っているようだ、とここではレールのドキュメントに反する: http://guides.rubyonrails.org/association_basics.html#self-joins
助けてください!
あなたの入力に感謝が、残念ながら。答えをGoogleに伝えることも助けにはならない。上記の私の詳細を見ましたか? item.manufacturerはベンダーオブジェクトを返しますが、nameなどのベンダーメソッドには応答できません。 – jmil
私はちょうど正しい方向にあなたを指すことを望んで、これに答える私の電話の上にあります。私は明日これを詳しく見て、私の答えを洗練させます。心配しないでください - 私はまだやっていません。 – jefflunt
大変ありがとう! – jmil