HABTM和命名约定

时间:2012-12-14 20:32:28

标签: ruby-on-rails has-and-belongs-to-many

我已经在铁轨问题上绞尽脑汁一段时间了,想要验证我的发现。我试图让Has_and_belongs_to_many关系起作用,但无法连接我的两个类,auctionItem和category。首先,在解决问题之前,这是我的迁移文件和两个类:

迁移文件:

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似乎不会将你的复数类名称重新归结为它&#39 ; s原始状态,如果它有一个下划线。例如,我的类名是AuctionItem,它成为模型的auction_items。而不是搜索 auctionitem.id ,寻找的SQL调用是 auction_item.id ,这是auction_items的单一版本。为什么没有搜索auctionitem.id?将来,当我使用多个单词类创建关联表时,我是否使用模型名称的单数下划线id版本?

1 个答案:

答案 0 :(得分: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

使用引用时应指定符号化的模型名称。

相关问题