2016-05-31 28 views
0

余分な列を追加するためにhas_and_belongs_to_manyアソシエーションをレール4でリファクタリングしようとしましたが、自己参照has_many_throughで苦労しています。レールで「不明な列」エラーを防ぐ方法を教えてください。

アイテムは多くのコンポーネントで構成できます。コンポーネントは本当に単なるアイテムなので、独自のコンポーネントを持つことができます。

class Item < ActiveRecord::Base 
    has_many :components, through: :component_items 
    has_many :component_items 
end 

class Component < ActiveRecord::Base 
    has_many :items, through: :component_items 
    has_many :component_items 
    self.table_name ="Items" 
end 

class ComponentItem < ActiveRecord::Base 
    has_many :items 
    has_many :components 
end 

とスキーマがどのように見える...

create_table "component_items", force: :cascade do |t| 
    t.integer "item_id",  limit: 4, null: false 
    t.integer "component_id", limit: 4, null: false 
end 

create_table "items", force: :cascade do |t| 
    t.string "sku", limit: 255 
    t.decimal "height", precision: 6, scale: 2 
    t.decimal "width", precision: 6, scale: 2 
    t.decimal "depth", precision: 6, scale: 2 
end 

はその後

i=Item.first 
i.components 

は私が取得:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'items.component_item_id' in 'on clause': SELECT items .* FROM items INNER JOIN component_items ON items . component_item_id = component_items . id WHERE component_items . item_id = 87675

私は列'items.component_item_id'を必要としないので、どこで間違って定義したのですか?次に、この関連付けをどのように機能させるのですか?

答えて

0

あなたのエラーは、理由テーブルitemsの列component_item_idの検索をレールが、あなたはそのような列を持っていない、私はあなたがそれにitembelongs_to関係を作成する必要があります信じて登場しかしあなたがスキーマの間だけで、間違ったrealtionsを持っているようですそしてあなたは私がモデルを提案して定義された現在のスキームのようなモデル、:

class Item < ActiveRecord::Base 
    has_many :components, through: :component_items 
    has_many :component_items 
end 

class Component < Item 
    has_many :items, through: :component_items 
    has_many :component_items 
end 

class ComponentItem < ActiveRecord::Base 
    belongs_to :item 
    belongs_to :component 
end 

NOTEこれはitems表にtypeという名前の追加の文字列フィールドが必要です。

+0

エラーは、 'item'テーブルではなく、' component_items'でカラムを探していることを示しています。列の名前を変更しても問題は解決されません。外部キーを指定しても何も変更されません。 – mvanio

+1

なぜ 'type'の必要性? – mvanio

関連する問題