Ошибка «столбец« id »не существует» при попытке связать роль с пользователем с помощью rails-авторизации - PullRequest
0 голосов
/ 27 марта 2009

Я впервые исследую Rails и пытаюсь добавить довольно простую систему безопасности на основе ролей в мое тестовое приложение. Некоторые из Google, похоже, указали на то, что rails-авторизация - путь для этого. Я следовал за README , и все, казалось, шло хорошо, но сейчас я пытаюсь связать User с Role, и это не удается. Вот фрагмент из моей 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"

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

Вот мой основной конфиг:

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

Ответы [ 4 ]

1 голос
/ 25 апреля 2009

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

class CulpritClass < ActiveRecord::Base

  set_primary_key :key_field_you_want

end
0 голосов
/ 04 декабря 2009

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

   belongs_to :inviter, :class_name => 'User'

Он генерировал user_id в качестве имени атрибута вместо inviter_id.

Конечным решением было добавить столбец id в role_users. Поскольку у меня уже была таблица role_users без суррогатного ключа, мне пришлось выполнить миграцию 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
0 голосов
/ 26 июня 2009

Я просто использовал два объявления первичного ключа

set_primary_key :user_id

set_primary_key :role_id

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

0 голосов
/ 12 мая 2009

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

set_primary_keys :user_id, :role_id

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

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

Это решило проблему в моем случае, которая, похоже, связана с Postgres.

...