混合has_one和has_and_belongs_to_many关联

时间:2011-01-11 17:49:13

标签: ruby-on-rails-3

我正在尝试建立一个url(链接)数据库。我有一个类别模型,它拥有并属于许多链接。

以下是我运行的迁移:

class CreateLinksCategories < ActiveRecord::Migration
  def self.up
    create_table :links_categories, :id => false do |t|
    t.references :link
    t.references :category
  end
end

def self.down
  drop_table :links_categories
  end
end

以下是链接模型:

class Link < ActiveRecord::Base  
  validates :path, :presence => true, :format => { :with  => /^(#{URI::regexp(%w(http     
                                                   https))})$|^$/ }
  validates :name, :presence => true

  has_one :category
end

以下是类别模型

class Category < ActiveRecord::Base
  has_and_belongs_to_many :links
end

当我尝试将第一个链接与第一个类别相关联时,控制台就会出现错误:

>>link = Link.first
=> #<Link id: 1, path: "http://www.yahoo.com", created_at: "2011-01-10...
>>category = Category.first
=> #<category id : 1, name: "News Site", created_at: "2011-01-11...
>>link.category << category
=> ActiveRecord::StatementInvalid: SQLite3::Exception: no such column :           
   categories.link_id:

我的协会是错的还是遗漏了数据库中的内容?我希望它能找到links_categories表。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

为什么你在这里使用HABTM?只需在链接上添加belongs_to :category,在类别上添加has_many :links即可。然后在db中,根本不需要连接表,只需要链接表上的:category_id。

但是,如果您确实想要HABTM,请快速浏览一下,我注意到的第一件事是您的连接表名称不正确 - 它应该按字母顺序排列,categories_links

第二件事是你不能混合has_one和has_and_belongs_to_many。 HABTM意味着 - A有许多B和A属于B的许多;这种关系意味着相反的情况也必须如此--B有很多A和B属于很多A.如果链接HABTM cateogries,那么类别必须是HABTM链接。

请参阅http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many