« Colonne « id »n'existe pas » erreur en essayant d'associer un rôle à un utilisateur à l'aide de rails-autorisation

StackOverflow https://stackoverflow.com/questions/689496

  •  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
Était-ce utile?

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

Comme il n'y a pas de champ id pour cette table (et il n'a pas besoin d'être)
 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top