'Colonna ‘id’ non esiste' errore durante il tentativo di associare un ruolo con un utente che utilizza le rotaie-autorizzazione

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

  •  22-08-2019
  •  | 
  •  

Domanda

Sto esplorando Rails per la prima volta e cercando di aggiungere un po 'di sicurezza basata sui ruoli abbastanza semplice per la mia prova app. Alcuni Googling sembrava indicare rotaie-autorizzazione è la strada da percorrere per Questo. Ho seguito la README e tutto sembrava andare per il verso bene, ma ora sto cercando di associare un User con un Role e viene a mancare. Ecco il frammento mia sessione 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"

Sono solo facendo qualcosa di stupido, o si tratta di un problema noto? Ho trovato essenzialmente lo stesso errore di una domanda nel gruppo Google per il plugin rails-authorization, ma non c'era una soluzione fornita.

Ecco la mia configurazione di base:

  • OS X
  • Rails 2.3.2
  • PostgreSQL
  • Plugin:
    • ristoratore-autenticazione
    • rotaie-autorizzazione
È stato utile?

Soluzione

Provare ad installare il composite_primary_keys gemma (link) e aggiungere il seguente al controller RolesUser:

set_primary_keys :user_id, :role_id

Dal momento che non v'è alcun campo ID per quella tabella (e ci non ha bisogno di essere), la chiave primaria diventa (user_id, role_id) cui è possibile aggiungere al database con

 ALTER TABLE roles_users ADD PRIMARY KEY (user_id, role_id);

Questo ha risolto il problema nel mio caso, che sembra essere Postgres-specifici.

Altri suggerimenti

incontrato lo stesso problema con i modelli in cui stavo usando una chiave primaria altro di 'id'. Si scopre che avevo dimenticato di dichiararla nella definizione della classe modello utilizzando "set_primary_key". Forse avete bisogno di fare qualcosa di simile:

class CulpritClass < ActiveRecord::Base

  set_primary_key :key_field_you_want

end

ho semplicemente usato due dichiarazioni chiave primaria

set_primary_key :user_id

set_primary_key :role_id

Questo ha funzionato per i miei scopi, ma di tenere presente che restituisce (in sql almeno) la seconda chiave primaria che si definisce. In questo caso sarebbe il ROLE_ID dell'oggetto.

Ho avuto lo stesso problema, ma su distruggo (dei ruoli). Ho provato la gemma composite_primary_keys ma ho trovato che si è rotto l'altro in Rails 2.3.4. In particolare, ha causato Rails :belongs_to associazione per generare il torto attribuito id in questa situazione:

   belongs_to :inviter, :class_name => 'User'

È stato generando user_id come nome attributo anziché inviter_id.

La soluzione finale era quello di aggiungere una colonna id a roles_users. Dal momento che ho già avuto un tavolo roles_users senza chiave surrogata ho dovuto fare questa migrazione lil:

  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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top