在Rails中HABTM和连接表的问题

Ant*_*nAL 1 ruby-on-rails fixtures has-and-belongs-to-many

我有一个简单的模型:

class User < ActiveRecord::Base
   has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
   has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)

我创建了一个简单的连接表:

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
Run Code Online (Sandbox Code Playgroud)

迁移后,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
Run Code Online (Sandbox Code Playgroud)

这些条目以相同的顺序显示在"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
Run Code Online (Sandbox Code Playgroud)

并遇到一个问题:在"rake db:fixtures:load"rails上抱怨连接表的名称:

SQLite3 :: SQLException:没有这样的表:roles_users:DELETE FROM"roles_users"WHERE 1 = 1

问题是 - 为什么它期望"roles_users",而表是"users_roles"?

Jim*_*nke 5

当Rails为连接表创建关联时,它期望模型按字母顺序排列.因为r在你之前,所以它创造了它roles_users.

我建议您重命名连接表,或者,您可以添加:join_table => "users_roles"到两个关联.