2010-10-13 7 views
0

J'ai un modèle de rôle et un modèle d'autorisation.Pourquoi HABTM génère-t-il des requêtes qui incluent une colonne 'id'?

Le modèle de rôle:

has_and_belongs_to_many :permissions 

Le modèle d'autorisation:

has_and_belongs_to_many :roles 

La migration pour créer la table permissions_roles:

class CreatePermissionsRoles < ActiveRecord::Migration 
    def self.up 
    create_table :permissions_roles, :id => false do |t| 
     t.integer :permission_id 
     t.integer :role_id 
    end 
    end 

    def self.down 
    drop_table :permissions_roles 
    end 
end 

Lorsque je tente d'attribuer des autorisations à un rôle , J'obtiens l'erreur "Nom de colonne invalide" id "." Un examen plus approfondi révèle que la requête est une tentative d'exécution:

INSERT INTO "permissions_roles" ("permission_id", "role_id", "id") VALUES (1, 1, 1) 

Pourquoi dans le monde est-il tente d'ajouter une ligne avec un identifiant?

+0

Avez-vous créé cette table auparavant avec une colonne ID, et vous avez oublié de la supprimer avant d'utiliser cette migration? Vous avez oublié de redémarrer votre serveur? Ou peut-être est-ce dans l'environnement de test et vous avez oublié d'exécuter 'rake db: test: prepare'? Le comportement semble maladroit, donc l'étape suivante consisterait à publier plus de code qui déclenche l'erreur et certains journaux. – jdl

+0

Voir ma réponse ci-dessous. Les schémas Microsoft SQL et mes expériences antérieures étaient en train de tout gâcher. –

Répondre

0

Compris. J'utilise Microsoft SQL à l'arrière. Cela a été l'une des nombreuses nuances de travailler avec Microsoft SQL. Le problème était que j'avais une table "dbo.permissions_roles" qui comprenait un champ id d'expérimentation préalable. La table qui contenait les données était "rails_sa.permissions_roles" qui n'incluait pas l'ID (rails_sa est le nom de mon schéma et de l'utilisateur qui se connecte).

Pour une raison que je ne peux toujours pas expliquer, les données derrière les modèles étaient stockées dans rails_sa.permissions_roles. Mais, la définition de la table de jointure provenait de dbo.permissions_roles. Je suis sûr qu'il y a une explication rationnelle à ce cas marginal.