2010-07-20 28 views
1

我有一个简单的模型:问题的HABTM和连接表中的Rails

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 

,并得到了一个问题:在 “耙分贝:灯具:负荷” 轨道抱怨连接表的名称:

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

的问题是 - 为什么它预计 “roles_users”,而该表是 “users_roles”?

回答

5

当Rails为连接表创建关联时,它期望模型按字母顺序排列。由于r在u之前,因此创建为roles_users

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

+0

非常感谢!有用 ! – AntonAL 2010-07-20 08:55:28