开发者

Mixing has_one and has_and_belongs_to_many associations

I'm trying to build a database of urls(links). I have a Category model that has and belongs to many Links.

Here's the migration I ran:

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

Here's the Link model:

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

  has_one :category
end

Here's the category model:

class Category < ActiveRecord::Base
  has_and_belongs_to_many :links
end

And here's the error the console kicked back when I tried to associate the first link with the first category:

>>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:

Are my associations wrong or am I missing something in the database? I expected it to find the links_categories table. Any help is appreciated.


Why are you using HABTM here at all? Just put a belongs_to :category on Link, and a has_many :links on Category. Then in the db, you don't need a join table at all, just a :category_id on the links table.

But, if you do want a HABTM here, from a quick glance, the first thing I noticed is that your join table is named incorrectly -- it should be alphabetical, categories_links.

The second thing is that you can't mix has_one and has_and_belongs_to_many. HABTM means just that -- A has many of B and A belongs to many of B; this relationship implies that the opposite must also be true -- B has many of A and B belongs to many of A. If links HABTM cateogries, then categories must HABTM links.

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜