Проблема с HABTM и таблицей соединений в Rails - PullRequest
1 голос
/ 20 июля 2010

У меня есть простая модель:

class User < ActiveRecord::Base
   has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
   has_and_belongs_to_many :users
end

Я создал простую таблицу соединений:

class CreateUsersRoles < ActiveRecord::Migration
  def self.up
    create_table :users_roles, :id => false do |t|
      t.integer :user_id
      t.integer :role_id

      t.timestamps
    end
  end

  def self.down
    drop_table :users_roles
  end
end

После миграции shema.rb выглядит следующим образом:

create_table "roles", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
end

create_table "users", :force => true do |t|
    t.string   "login"
    t.string   "password"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

create_table "users_roles", :id => false, :force => true do |t|
  t.integer  "user_id"
  t.integer  "role_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

Записи представлены здесь в том же порядке, что и в "schema.rb"

Я расположил светильники следующим образом:

# roles.yml 
user:
  name: user

admin:
  name: admin

moderator:
  name: moderator

# users.yml
User1:
  login: User1
  password: User1
  roles: user

User2:
  login: User2
  password: User2
  roles: admin, moderator

User3:
  login: User3
  password: User3
  roles: moderator

И возникла проблема: на "rake db: fixtures: load" rails жалуется на имя таблицы соединения:

SQLite3 :: SQLException: нет такой таблицы: role_users: УДАЛИТЬ ОТ "role_users" ГДЕ 1 = 1

Вопрос в том - почему он ожидает "role_users", а таблица - "users_roles"?

1 Ответ

5 голосов
/ 20 июля 2010

Когда Rails создает ассоциацию для таблицы соединений, ожидается, что модели будут в алфавитном порядке.Поскольку r предшествует u, он создает его как roles_users.

. Я предлагаю переименовать таблицу соединений, в качестве альтернативы, вы можете добавить :join_table => "users_roles" к обеим ассоциациям.

...