« Colonne « id »n'existe pas » erreur en essayant d'associer un rôle à un utilisateur à l'aide de rails-autorisation
-
22-08-2019 - |
Question
J'explore Rails pour la première fois et d'essayer d'ajouter une certaine sécurité basée sur les rôles assez simple à mon application de test. Googling semblait indiquer rails autorisation est la voie à suivre pour cette. Je suivais le README et tout semblait aller bien, mais maintenant je suis en train d'associer un User
avec un Role
et il échoue. Voici l'extrait de ma session de script/console
:
>> u = User.find(:first)
=> #<User id: 1, login: "cwhit", name: "", email: "cwhitfield@unica.com", crypted_password: "7ac064547fb8992e8e53e936df31657a40f9c5af", salt: "56671492059f8e40eb3d509940944aaba31ebc72", created_at: "2009-03-26 18:06:04", updated_at: "2009-03-26 18:06:04", remember_token: nil, remember_token_expires_at: nil>
>> r = Role.find(:first)
=> #<Role id: 1, name: "ProjectManager", authorizable_type: nil, authorizable_id: nil, created_at: "2009-03-27 11:02:35", updated_at: "2009-03-27 11:02:35">
>> u.has_role r
ActiveRecord::StatementInvalid: PGError: ERROR: column "id" does not exist
LINE 1: ....546623', '2009-03-27 11:42:16.546623', 5, 1) RETURNING "id"
^
: INSERT INTO "roles_users" ("created_at", "updated_at", "role_id", "user_id") VALUES('2009-03-27 11:42:16.546623', '2009-03-27 11:42:16.546623', 5, 1) RETURNING "id"
Suis-je ne fais que quelque chose de stupide, ou est-ce un problème connu? J'ai trouvé essentiellement le même d'erreur dans une question au sein du groupe Google pour le plugin rails-authorization
, mais il n'y avait pas de solution fournie.
Voici ma config de base:
- OS X
- Rails 2.3.2
- PostgresQL
- Plugins:
- authentification reposant
- rails autorisation
La solution
Essayez d'installer la gemme composite_primary_keys
(lien) et ajouter ce qui suit au contrôleur RolesUser:
set_primary_keys :user_id, :role_id
, la clé primaire devient (user_id, role_id)
que vous pouvez ajouter à la base de données
ALTER TABLE roles_users ADD PRIMARY KEY (user_id, role_id);
a résolu le problème dans mon cas, ce qui semble être Postgres spécifique.
Autres conseils
rencontré le même problème avec les modèles où j'utilisais une autre clé primaire que « id ». Il s'avère que je l'avais oublié de le déclarer dans la définition de classe de modèle à l'aide « set_primary_key ». Peut-être que vous devez faire quelque chose comme ceci:
class CulpritClass < ActiveRecord::Base
set_primary_key :key_field_you_want
end
J'ai simplement utilisé deux déclarations clés primaires
set_primary_key :user_id
set_primary_key :role_id
Cela a fonctionné pour mes fins, mais gardez à l'esprit qu'il retourne (dans le sql au moins) la deuxième clé primaire que vous définissez. Dans ce cas, il serait le role_id de l'objet.
I had the same problem but on destroy (of roles). I tried the composite_primary_keys
gem but found that it broke other things in Rails 2.3.4. Specifically, it caused Rails :belongs_to
association to generate the wrong attributed id in this situation:
belongs_to :inviter, :class_name => 'User'
It was generating user_id
as the attribute name instead of inviter_id
.
The ultimate solution was to add an id column to roles_users. Since I already had a roles_users table with no surrogate key I had to do this lil migration:
class AddIdToRolesUsers < ActiveRecord::Migration
def self.up
# create new table the way it should be (_with_ a traditional Rails id column)
create_table :x_roles_users do |t|
t.belongs_to :role
t.belongs_to :user
t.timestamps
end
execute 'insert into x_roles_users (user_id, role_id, created_at, updated_at) select * from roles_users'
drop_table :roles_users
rename_table :x_roles_users, :roles_users
end
def self.down
remove_column :roles_user, :id
end
end