복붙노트

[RUBY-ON-RAILS] 레일의 기본 키를 변경하면 문자열이어야합니다

RUBY-ON-RAILS

레일의 기본 키를 변경하면 문자열이어야합니다

그래서 나는 두 가지 모델로, 주 및 취득을 가지고있다. 주 has_many 취득. (51 개) 레코드에 대한 기본 키 오히려 바보였다 정수 나는 autoincrementing 것 같은 느낌이 들었다. 국가는 (주이 두 글자 약어 인 PK가 될하기위한 모델을 변경 나는 그래서, 나는 실제 상태 이름 어디를 저장하고 있지 않다 :

class State < ActiveRecord::Base  
  self.primary_key = "state"  
  has_many :acquisition_histories  
end

문제는 내가 내 취득 모델을 만들 때, 그것은 정수로 외래 키 열 STATE_ID을 생성합니다. 보다 구체적으로, 스크립트 / 생성 마이그레이션했다 :

class CreateAcquisitions < ActiveRecord::Migration  
  def self.up  
    create_table :acquisitions do |t|  
      t.date :date  
      t.string :category  
      t.text :notes  
      t.references :state  
      t.timestamps  
    end
  end
end

나는 INT 해당 t.references 데이터 유형 세트를 가정하고있다. (: 상태 마이그레이션 스크립트에서 말씀에도 불구하고, 그리고 예, 그것은 데이터베이스에 STATE_ID라고) 문제는 내 테이블의 인수에 STATE_ID 필드에 상태 약어를 넣어하려고 내 취득 클래스에 메서드를 만드는 것입니다. 이 방법은 실패하지 않습니다,하지만 STATE_ID 필드에 0을 넣어 않고 기록 에테르로 이동합니다.

해결법

  1. ==============================

    1.당신은 기본적으로 맞서 싸울하지 않는 경우 레일이 가장 잘 작동합니다. 그것은 당신의 상태 테이블에 정수 기본 키가 무엇을 해합니까?

    당신은 기본적으로 맞서 싸울하지 않는 경우 레일이 가장 잘 작동합니다. 그것은 당신의 상태 테이블에 정수 기본 키가 무엇을 해합니까?

    당신이 기존의 스키마와 붙어 아니라면 당신이 통제 할 수 없다는 것을, 나는 당신이 구성을 통해, 맞죠? - 그리고 농축 등의 UI와 같은 응용 프로그램의 중요한 부분에 레일 기본값 - 규칙에 충실 조언 것 비즈니스 로직.

  2. ==============================

    2.비록, 나는 이것이 당신이 실제로 당신이 부탁 한 일을 할 경우에 대비, 다른 기본값에 대해 작업의 여분의 노력을 고려 그것의 가치보다 더 문제가 될 수 있음을 동의합니다 :

    비록, 나는 이것이 당신이 실제로 당신이 부탁 한 일을 할 경우에 대비, 다른 기본값에 대해 작업의 여분의 노력을 고려 그것의 가치보다 더 문제가 될 수 있음을 동의합니다 :

    상태 마이그레이션을 만들기 :

    class CreateStatesTable < ActiveRecord::Migration  
      def change
        create_table :states, id: false do |t|
          t.string :state, limit: 2
          t.string :name
          t.index :state, unique: true
        end
      end
    end
    

    국가 모델 :

    class State < ActiveRecord::Base
      self.primary_key = :state
    end
    

    참고 레일 3.2 전에,이 것을 set_primary_key = 대신 = self.primary_key의 상태 참조 : http://guides.rubyonrails.org/3_2_release_notes.html#active-record-deprecations

  3. ==============================

    3.여기에 자신을 발견 ... 휴가를 당신이 할 수있는과에 가서 빨리 같은 경우 : 레일을 사용하여, 어떻게하지 내 기본 키는 정수 형식의 열 수 설정할 수 있습니까?

    여기에 자신을 발견 ... 휴가를 당신이 할 수있는과에 가서 빨리 같은 경우 : 레일을 사용하여, 어떻게하지 내 기본 키는 정수 형식의 열 수 설정할 수 있습니까?

  4. ==============================

    4.난 당신이 절대적으로 필요한 특정 아니라면 사용의 기본 키와 같은 UUID를, 그리고 솔직히, 나는 그것을하지 않는 것이 좋습니다 프로젝트에서 일하고 있어요. 데이터베이스와 수정되지 않은 작동하지 않습니다 거기 레일 플러그인의 톤이 있습니다 기본 키로서 사용하는 문자열이.

    난 당신이 절대적으로 필요한 특정 아니라면 사용의 기본 키와 같은 UUID를, 그리고 솔직히, 나는 그것을하지 않는 것이 좋습니다 프로젝트에서 일하고 있어요. 데이터베이스와 수정되지 않은 작동하지 않습니다 거기 레일 플러그인의 톤이 있습니다 기본 키로서 사용하는 문자열이.

  5. ==============================

    5.레일 5.1에서는 생성시 기본 키의 유형을 지정할 수 있습니다 :

    레일 5.1에서는 생성시 기본 키의 유형을 지정할 수 있습니다 :

    create_table :states, id: :string do |t|
    # ...
    end
    

    문서에서 :

  6. ==============================

    6.그 mkirk의 대답은 가짜 기본 키를 생성합니다. 액티브는 기본 키가 무엇인지 이야기해야 할 이유를 설명. 테이블이 계시 검사

    그 mkirk의 대답은 가짜 기본 키를 생성합니다. 액티브는 기본 키가 무엇인지 이야기해야 할 이유를 설명. 테이블이 계시 검사

                Table "public.acquisitions"
     Column |         Type         | Modifiers
    --------+----------------------+-----------
     state  | character varying(2) |
     name   | character varying    |
    Indexes:
        "index_acquisitions_on_state" UNIQUE, btree (state)
    

    거기에 아무것도 잘못 때문에 예상하지만 좋을 수 있기 때문에이 작품을 연습합니다.

    우리는 id 컬럼을 유지하고 문자열 *에 자사의 유형을 변경할 수 있습니다. 마이그레이션 모습처럼

    class CreateAcquisitionsTable < ActiveRecord::Migration  
      def change
        create_table :acquisitions do |t|
          t.string :name
        end
        change_column :acquisitions, :id, :string, limit: 2
      end
    end
    

    표를 검사하면 같은 고유 키 제한 조건 (필요 없음 고유 인덱스), NOT NULL 제약 및 자동 증가 키로서 모든 케이크와 실제 기본 키를 가지고 있음을 알 수있다.

                                    Table "public.acquisitions"
     Column |         Type         |                     Modifiers
    --------+----------------------+---------------------------------------------------
     id     | character varying(2) | not null default nextval('acquisitions_id_seq'::regclass)
     name   | character varying    |
    Indexes:
        "acquisitions_pkey" PRIMARY KEY, btree (id)
    

    그리고 당신은 명시 적으로 기본이 무엇인지 액티브 말할 필요가 없습니다.

    당신은 아무 것도 제공하지 않은 경우 기본 ID를 설정하는 것이 좋습니다 것입니다.

    class MyModel < ActiveRecord::Base
      before_create do
        self.id = SecureRandom.uuid unless self.id
      end
    end
    

    * 면책 조항 : 당신이 좋은 이유가없는 한 기본 기본 키를 변경하지 마십시오

  7. ==============================

    7.당신은 레일 규칙을 따르십시오. 여분의 기본 키는 어떤 식 으로든 문제가되지 않습니다. 그냥 사용합니다.

    당신은 레일 규칙을 따르십시오. 여분의 기본 키는 어떤 식 으로든 문제가되지 않습니다. 그냥 사용합니다.

  8. ==============================

    8.*** 나는 기본 키로서 사용되는 문자열 약간의 경험이 있고 그것은에 통증이 있습니다. 컨트롤러 / : 액션 / : ID 패턴의 : ID는 문자열입니다 이것은 아마 IDS가 이상하게 포맷받을 경우 문제를 라우팅으로 이어질 것입니다) 기본으로 객체를 전달하려면 기본적으로 그 기억

    *** 나는 기본 키로서 사용되는 문자열 약간의 경험이 있고 그것은에 통증이 있습니다. 컨트롤러 / : 액션 / : ID 패턴의 : ID는 문자열입니다 이것은 아마 IDS가 이상하게 포맷받을 경우 문제를 라우팅으로 이어질 것입니다) 기본으로 객체를 전달하려면 기본적으로 그 기억

  9. ==============================

    9.

    class CreateAcquisitions < ActiveRecord::Migration  
        def self.up  
            create_table :acquisitions, :id => false do |t|  
              t.date :date  
              t.string :category  
              t.text :notes  
              t.references :state  
              t.timestamps
            end
        end
    end
    
  10. from https://stackoverflow.com/questions/750413/altering-the-primary-key-in-rails-to-be-a-string by cc-by-sa and MIT license