2009-03-27 3 views
0

初めてRailsを試していて、テストアプリにかなり単純な役割ベースのセキュリティを追加しようとしています。いくつかのグーグルがrails-authorizationがこれを行う方法だと思われたようです。私はREADMEに続き、すべてがうまくいくように見えましたが、今はUserRoleに関連付けようとしていますが、失敗します。rails-authorizationを使用してユーザにロールを関連付けるときに 'column "id" does not exist'エラーが発生しました

>> 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" 

アムは、私はちょうど愚かな何かをやって、またはこれは既知の問題です。ここに私のscript/consoleセッションからの抜粋ですか? rails-authorizationプラグインのGoogleグループの質問にessentially the same errorが見つかりましたが、解決策はありませんでした。

ここに私の基本的な設定です:

  • OS X
  • のRails 2.3.2
  • PostgreSQLの
  • プラグイン:
    • 安らかな認証
    • レール承認
    は、

答えて

0

composite_primary_keys宝石(link)をインストールしてみてくださいRolesUserコントローラに以下を追加します)である必要はありませんが、主キーはあなたがそう

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

これでデータベースに追加することができます(user_id, role_id)なり私のケースではPostgres固有の問題を抱えていました。

1

「id」以外の主キーを使用していたモデルでも同じ問題が発生します。 私は、 "set_primary_key"を使ってモデルクラス定義でそれを宣言するのを忘れていました。おそらくあなたは、このような何かを実行する必要があります。そこ

set_primary_keys :user_id, :role_id 

何idフィールドは、そのテーブルのために存在しないので(と:

class CulpritClass < ActiveRecord::Base 

    set_primary_key :key_field_you_want 

end 
0

私は単にこれは私の目的のために働いていたが、それは(少なくともSQLで)ユーザーが定義する第二主キーを返すことに注意してください

set_primary_key :user_id 

set_primary_key :role_id 

2つのプライマリキーの宣言を使用していました。この場合、オブジェクトのrole_idになります。

0

私は同じ問題を抱えていましたが、(役割の)破壊には同じ問題がありました。私はcomposite_primary_keys gemを試しましたが、Rails 2.3.4で他のものが壊れていることがわかりました。具体的には、それは間違っを生成するために、Railsの:belongs_to関連を引き起こし、このような状況でIDを帰せ:

belongs_to :inviter, :class_name => 'User' 

それは代わりにinviter_idの属性名としてuser_idを生成していました。

究極のソリューションは、roles_usersにid列を追加することでした。私はすでに私はこのlilの移行をしなければならなかった無代理キーで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' 'でこの問題はよく知られており、パッチは2つの完全な年のために利用可能です。残念ながら、パッチは宝石に巻き込まれていません。 http://groups.google.com/group/compositekeys/browse_thread/thread/502e6b0d77cac8c9/682eb7545d01b141 –

関連する問題