'열“ID”열이 존재하지 않는다'오류 '오류'는 Rails Authorization을 사용하여 사용자와 역할을 연관 시키려고 노력합니다.

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

  •  22-08-2019
  •  | 
  •  

문제

나는 처음으로 레일을 탐색하고 테스트 앱에 상당히 간단한 역할 기반 보안을 추가하려고 노력하고 있습니다. 일부 인터넷 검색은 나타나는 것 같았습니다 Rails 저자 이것을 찾는 방법입니다. 나는 따랐다 readme 그리고 모든 것이 잘 진행되고있는 것처럼 보였지만 이제는 나는 User a 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
  • 플러그인 :
    • 편안한 인증
    • Rails 저자
도움이 되었습니까?

해결책

설치 해보세요 composite_primary_keys 보석 (링크) 롤러스 컨트롤러에 다음을 추가하십시오.

set_primary_keys :user_id, :role_id

해당 테이블에 대한 ID 필드가 없기 때문에 (필요하지 않음) 기본 키는 (user_id, role_id) 데이터베이스에 추가 할 수 있습니다

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

이것은 내 경우에 문제를 해결했는데, 이는 포스트 그레스에 따른 것으로 보인다.

다른 팁

'ID'이외의 기본 키를 사용하고있는 모델과 동일한 문제를 해결했습니다. "set_primary_key"를 사용하여 모델 클래스 정의에서 선언하는 것을 잊어 버린 것으로 나타났습니다. 아마도 당신은 다음과 같은 일을해야 할 것입니다.

class CulpritClass < ActiveRecord::Base

  set_primary_key :key_field_you_want

end

나는 단순히 두 가지 주요 키 선언을 사용했습니다

set_primary_key :user_id

set_primary_key :role_id

이것은 내 목적을 위해 효과가 있었지만 (적어도 SQL에서) 당신이 정의하는 두 번째 기본 키를 반환한다는 것을 명심하십시오. 이 경우 객체의 역할이 있습니다.

나는 같은 문제가 있었지만 (역할의) 파괴에있어서. 나는 시도했다 composite_primary_keys 보석이지만 Rails 2.3.4에서 다른 것들을 깨뜨렸다는 것을 알았습니다. 구체적으로, 그것은 레일을 일으켰습니다 :belongs_to 이 상황에서 잘못된 ID를 생성하는 연관성 :

   belongs_to :inviter, :class_name => 'User'

생성되었습니다 user_id 대신 속성 이름으로 inviter_id.

궁극적 인 솔루션은 roles_users에 ID 열을 추가하는 것이 었습니다. 대리 키가없는 role_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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top