2012-12-14 89 views
0

我一直在繞軌道問題爭論一段時間,並想驗證我的發現。我試圖讓Has_and_belongs_to_many關係正常工作,但無法連接我的兩個類auctionItem和category。首先,這裏是我的移民文件,並解決問題前兩類:HABTM和命名約定

遷移文件:

class AuctionItemsCategories < ActiveRecord::Migration 
    def up 
    create_table 'auction_items_categories', :id=>false do |t| 
     t.reference :auctionItem_id 
     t.references :category_id 
    end 
    end 

    def down 
    drop_table 'auction_items_categories' 
    end 
end 

Category.rb

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :auction_items 
end 

auction_item.rb

class AuctionItem < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

創建AuctionItem的實例後,我嘗試了

auction_item = AuctionItem.last 
auction_item.categories 

...並得到了以下錯誤:

NoMethodError: undefined method `categories' for #<AuctionItem:0x0000010521b870> 

經過一番研究,我發現添加特定類的has_and_belongs_to_many幫助:

類別型號

has_and_belongs_to_many :auction_items , :class_name => 'AuctionItem' 

auction_item型號

has_and_belongs_to_many :categories , :class_name => 'Category' 

這解決了這個問題,我能夠訪問分類表。我去嘗試一個類別追加到拍賣項目:

auction_item.categories << category 

然後我得到了收到以下錯誤:

SELECT "auction_items".* FROM "auction_items" INNER JOIN "auction_items_categories" ON "auction_items"."id" = "auction_items_categories"."auction_item_id" WHERE "auction_items_categories"."category_id" = 2 
SQLite3::SQLException: no such column: auction_items_categories.auction_item_id: SELECT "auction_items".* FROM "auction_items" INNER JOIN "auction_items_categories" ON "auction_items"."id" = "auction_items_categories"."auction_item_id" WHERE "auction_items_categories"."category_id" = 2 
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: auction_items_categories.auction_item_id: SELECT "auction_items".* FROM "auction_items" INNER JOIN "auction_items_categories" ON "auction_items"."id" = "auction_items_categories"."auction_item_id" WHERE "auction_items_categories"."category_id" = 2 

如果您發現,該查詢試圖讓auction_item.id而比AuctionItem.id。去上班的連接,我有我的遷移文件更改爲以下:

class AuctionItemsCategories < ActiveRecord::Migration 
    def up 
    create_table 'auction_items_categories', :id=>false do |t| 
     t.integer :auction_item_id 
     t.integer :category_id 
    end 
    end 

    def down 
    drop_table 'auction_items_categories' 
    end 
end 

所以長話短說/ TL DR版本:對於我來說,似乎與多個單詞命名你的類時,並使用駱駝的情況下,如果有下劃線,rails不會將您的複數類名稱單數化回它的原始狀態。例如,我的班級名稱是AuctionItem,它成爲模型的auctions_items。而不是搜索auctionitem.id,查找的SQL調用是auction_item.id,這是auction_items的單數版本。爲什麼沒有搜索auctionitem.id?將來,當我使用多詞類進行關聯表時,是否使用模型名稱的單數下劃線id版本?

回答

1

您的原始遷移不正確。它應該如下:

class AuctionItemsCategories < ActiveRecord::Migration  
    def up 
    create_table 'auction_items_categories', :id => false do |t| 
     t.references :auction_item 
     t.references :category 
    end 
    end 

    def down 
    drop_table 'auction_items_categories' 
    end 
end 

您應該在使用引用時指定符號模型名稱。