has_and_belongs_to_many выдает ошибку «нет такой таблицы» - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть отношение многие-к-многим между досье и контактом, и поэтому они имеют отношение has_and_belongs_to_many:

class Dossier < ActiveRecord::Base
  has_and_belongs_to_many :contacts

и

class Contact < ActiveRecord::Base
  has_and_belongs_to_many :dossiers

В методе show контроллера Dossiers у меня есть это:

@dossier = current_user.company.dossiers.find(params[:id])    
@dossier_contacts = @dossier.contacts

Но когда я запрашиваю представление представления, я получаю ошибку:

SQLite3::SQLException: no such table: contacts_dossiers: SELECT COUNT(*) FROM "contacts" INNER JOIN "contacts_dossiers" ON "contacts"."id" = "contacts_dossiers"."contact_id" WHERE "contacts_dossiers"."dossier_id" = 1

Вид выглядит так:

<li><%= I18n.t :dossier_nr_contacts %></li><li><%= @dossier_contacts.count.to_s %></li>

Я думаю, что установил правильные отношения, таблица существует, но я не знаю, почему она выдает ошибку. Есть какие-нибудь подсказки?

Редактировать: Миграция, которую я сделал:

class CreateDossiersContactsJoinTable < ActiveRecord::Migration
  def up
    create_table :dossiers_contacts, :id => false do |t|
      t.integer :dossier_id
      t.integer :contact_id
    end
  end

  def self.down
    drop_table :dossiers_contacts
  end
end

Ответы [ 2 ]

18 голосов
/ 21 декабря 2011

Неправильно указано имя вашей таблицы присоединения.

Должно быть contacts_dossiers (по умолчанию в алфавитном порядке)

Если вы создаете ассоциацию has_and_belongs_to_many, вам нужно явно создать присоединяющуюся таблицу. Если имя таблицы объединения не указано явно с помощью параметра :join_table, Active Record создает имя с использованием лексического порядка имен классов. Таким образом, соединение между моделями клиентов и заказов даст имя таблицы соединений по умолчанию «customer_orders», потому что «c» превосходит «o» в лексическом порядке.

Источник: http://guides.rubyonrails.org/association_basics.html#creating-join-tables-for-has_and_belongs_to_many-associations

1 голос
/ 21 декабря 2011

Если вы используете has_and_belongs_to_many, вам всегда нужна таблица ассоциации, которая содержит пары идентификаторов для вас.По соглашению эта таблица называется множественным числом объединенных таблиц!В вашем примере contacts_dossiers.

Вам необходимо создать эту таблицу.Создайте миграцию и создайте таблицу следующим образом:

create_table :contacts_dossiers, :id => false do |f|
     f.integer :contact_id, :dossier_id
end

Затем перенесите таблицу, и все должно работать!

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