2010-07-20 79 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