Получение [nil, nil] в многоколоночном индексе в Rails - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть это:

class CreateStudentHasSubjects < ActiveRecord::Migration[5.2]                                                                                                            
  def change                                                                                                                                                             
    create_table :student_has_subjects do |t|                                                                                                                            
      t.references :student, null: false, foreign_key: true                                                                                                              
      t.references :subject, null: false, foreign_key: true                                                                                                              
      t.boolean :is_active, null: false, default: true                                                                                                                   

      t.index [:student, :subject] #Here's where the question comes in.                                                                                                                                       

      t.timestamps                                                                                                                                                       
    end                                                                                                                                                                  
  end                                                                                                                                                                    
end        

и когда я выполняю $ rails db:migrate, я получаю в файле schema.rb:

create_table "student_has_subjects", force: :cascade do |t|                                                                                                            
    t.integer "student_id", null: false                                                                                                                                  
    t.integer "subject_id", null: false                                                                                                                                  
    t.boolean "is_active", default: true, null: false                                                                                                                    
    t.datetime "created_at", null: false                                                                                                                                 
    t.datetime "updated_at", null: false                                                                                                                                 
    t.index ["student_id"], name: "index_student_has_subjects_on_student_id"                                                                                             
    t.index ["subject_id"], name: "index_student_has_subjects_on_subject_id"                                                                                             
    t.index [nil, nil], name: "index_student_has_subjects_on_student_and_subject" #WTF? [nil, nil]                                                                                        
  end

Это [nil, nil] пугает меня. Может кто-нибудь объяснить мне, почему я получаю это вместо:

t.index ["student_id", "subject_id"], name: "index_student_has_subjects_on_student_and_subject"

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Это происходит потому, что вы используете ссылочные имена вместо имен столбцов. Согласно исходному коду , t.index поддерживает только имена столбцов.

Также обратите внимание, что если вы добавляете многостолбцовый индекс на student_id и subject_id, первый индекс на student_id, вероятно, будет избыточным. Это касается как минимум PostgreSQL.

0 голосов
/ 05 сентября 2018

вам нужно удалить это ...

t.index [:student, :subject]

и добавьте это ...

class CreateStudentHasSubjects < ActiveRecord::Migration[5.2]                                                                                                            
  def change                                                                                                                                                             
    create_table :student_has_subjects do |t|                                                                                                                            
      t.references :student, null: false, foreign_key: true                                                                                                              
      t.references :subject, null: false, foreign_key: true                                                                                                              
      t.boolean :is_active, null: false, default: true                                                                                                                                                                                                                                            

      t.timestamps                                                                                                                                                       
    end  

    add_index :student_has_subjects, [:student, :subject]                                                                                                                                                 
  end                                                                                                                                                                    
end  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...