2012-12-14 93 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 

您应该在使用引用时指定符号模型名称。