2009-03-27 2 views
0

Я впервые изучаю Rails и пытаюсь добавить довольно простую безопасность на основе ролей в тестовое приложение , Некоторый Googling, казалось, указывал, что rails-authorization - это способ пойти на это. Я последовал за README, и все, казалось, идет хорошо, но теперь я пытаюсь связать User с Role, и он терпит неудачу. Вот отрывок из моей script/console сессии:Ошибка «column» id «не существует» при попытке связать роль с пользователем с помощью rails-authorization

>> u = User.find(:first) 
=> #<User id: 1, login: "cwhit", name: "", email: "[email protected]", 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" 

Am Я просто делаю что-то глупое, или это известная проблема? Я нашел essentially the same error в вопросе в группе Google для плагина rails-authorization, но решения не было.

Вот моя основная конфигурация:

  • OS X
  • Rails 2.3.2
  • PostGreSQL
  • Плагины:
    • успокоительных аутентификации
    • рельсов авторизация

ответ

0

Попробуй установить composite_primary_keys камень (link) и добавьте следующие строки в контроллер RolesUser:

set_primary_keys :user_id, :role_id 

Поскольку нет никакого поля идентификатора для этой таблицы (и там не нужно быть), первичный ключ становится (user_id, role_id), который можно добавить в базу данных с

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

это так Проблема в моем случае, которая, по-видимому, специфична для Postgres.

1

Ошибка в той же проблеме с моделями, где я использовал первичный ключ, отличный от «id». Оказывается, я забыл объявить его в определении класса модели с помощью «set_primary_key». Возможно, что вам нужно сделать что-то вроде этого:

class CulpritClass < ActiveRecord::Base 

    set_primary_key :key_field_you_want 

end 
0

я просто использовал два основных ключевых деклараций

set_primary_key :user_id 

set_primary_key :role_id 

Это работает для моих целей, но имейте в виду, что она возвращает (в SQL, по крайней мере) второй первичный ключ, который вы определяете. В этом случае это будет role_id объекта.

0

У меня была такая же проблема, но и на уничтожение (ролей). Я попробовал камень composite_primary_keys, но обнаружил, что он повредил другие вещи в Rails 2.3.4. В частности, это вызвало Rails :belongs_to ассоциации генерировать неправильно приписывали идентификатор в этой ситуации:

belongs_to :inviter, :class_name => 'User' 

Это производило user_id в качестве имени атрибута вместо inviter_id.

Конечным решением было добавить столбец id в role_users.Так как у меня уже есть таблица roles_users, без суррогатного ключа я должен был сделать это лил миграции:

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 
+0

Кстати эта проблема с 'composite_primary_keys' хорошо известна и патч доступен в течение двух полных лет. К сожалению, патч не был включен в драгоценный камень. http://groups.google.com/group/compositekeys/browse_thread/thread/502e6b0d77cac8c9/682eb7545d01b141 –