Смешивание ассоциаций has_one и has_and_belongs_to_many - PullRequest
3 голосов
/ 11 января 2011

Я пытаюсь создать базу данных 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

Вот модель Link:

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 Ответ

2 голосов
/ 11 января 2011

Почему вы вообще используете HABTM здесь? Просто поместите belongs_to :category в Link, и has_many :links в Category. Тогда в БД вам вообще не нужна таблица соединений, просто a: category_id в таблице ссылок.

Но, если вы хотите, чтобы HABTM здесь, с первого взгляда, первое, что я заметил, это то, что ваша таблица соединений названа неправильно - она ​​должна быть в алфавитном порядке, categories_links.

Во-вторых, вы не можете смешивать has_one и has_and_belongs_to_many. HABTM означает только то, что - A имеет много B и A принадлежит многим из B; это соотношение подразумевает, что обратное также должно быть истинным - B имеет много A, а B принадлежит многим из A. Если ссылки связаны с категриями HABTM, то категории должны иметь ссылки HABTM.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...