【问题标题】:HABTM and Naming conventionsHABTM 和命名约定
【发布时间】:2012-12-14 20:32:27
【问题描述】:

一段时间以来,我一直在为一个 Rails 问题绞尽脑汁,想验证我的发现。我试图让 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

类别.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 ,它变成了模型的auction_items。不是搜索 auctionitem.id,而是寻找的 sql 调用是 auction_item.id,它是auction_items 的单数化版本。为什么不搜索auctionitem.id?以后在做多词类的关联表时,是不是用单数下划线的id版本的模型名?

【问题讨论】:

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


    【解决方案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
    

    使用参考时应指定符号化模型名称。

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多