0

У меня есть проект Rails с базой данных postgresql.Rails/postgresQL ActiveRecord - КАК И ПОЧЕМУ изменить первичный ключ?

Скажем, у меня есть три модели - студент, преподаватель и расписание - что присоединяется к ученику и учителю

Студент модели - Вместо того, чтобы идти с student_id как мой первичный ключ, я хочу, чтобы изменить это на even_cooler_unique_student_number что школа для ученика.

Модель учителя - типичный & традиционный.

Модель расписания. Я хочу связать расписание (подумайте - только математический класс) с одним учителем и его учениками. Как это сделать на уровне базы данных и с ассоциациями AR?

Что изменит первичный_файл на базу данных? К моим ассоциациям через ActiveRecord?

class CreateStudent < ActiveRecord::Migration 
    def change 
    create_table :students do |t| 
     t.integer :unique_cooler_student_id, null: false 
     t.string :first_name 
     t.string :last_name 

     t.timestamps null: false 
    end 
    end 
end 

class CreateTeacher < ActiveRecord::Migration 
    def change 
    create_table :teachers do |t| 
     t.string :first_name 
     t.string :last_name 
     t.string :department 

     t.timestamps null: false 
    end 
    end 
end 

class CreateSchedules < ActiveRecord::Migration 
    def change 
    create_table :schedules, id: false, force: true do |t| 
     t.belongs_to :students, :primary_key => 'unique_cooler_student_id' 
     t.belongs_to :teachers 
     t.string :something_else 


     t.timestamps null: false 
    end 
    end 
end 

class Student 
self.primary_key = 'unique_cooler_student_id' 
    has_many :teachers, through: :classes 
end 

class Teacher 
    has_many :students, through: :classes 
end 

class Schedule 
    belongs_to :students 
    belongs_to :teachers 
end 
+1

Почему бы вам не просто сохранить первичный ключ и добавить 'even_cooler_unique_student_number' в качестве столбца в таблице учеников? Я уверен, что вы рассмотрели эту смехотворно простую альтернативу, поэтому должна быть какая-то причина, по которой вы решили против нее. Объяснение поможет нам понять, чего вы пытаетесь достичь, и указать путь к подходящему техническому решению. – MarsAtomic

+0

Вы читали путеводитель по маршрутам по переселениям? Это лучше всего подходит для ответа на этот материал: http://edgeguides.rubyonrails.org/active_record_migrations.html Примечание. Я согласен, вам, вероятно, не следует изменять первичный ключ - просто добавьте новый столбец. Вы можете установить ограничения на столбец, если вам нужно. –

ответ

0

Изменения имени первичного ключа обычно делает очень мало, кроме добавления ложного чувства безопасности - которое только неизвестности.

You can however change the primary key from a auto-incrementing integer to a hash or some other sort of UUID. И есть много веских причин для этого. Это исключительно изменяет способ генерации первичных ключей.

Вы можете даже иметь отдельные внешние UUID, которые используются, например, в параметрах url. Однако это не связано с изменением первичного ключа, который ActiveRecord использует присоединиться к записи:

Foo.joins(:bars).find_by(uuid: 'ABCD') 

Конечно ActiveRecord позволит вам взломать вне tin-foil hat и использовать любые первичные ключи вы хотите - однако вам нужно будет указать primary_key и возможно, также вручную настроить внешние ключи в своей базе данных для поддержания ссылочной целостности. Таким образом, в основном, вы теряете все преимущества конвенции по сравнению с конфигурацией без какой-либо выгоды.

Вы должны сделать это так:

class CreateSchedules < ActiveRecord::Migration 
    def change 
    create_table :schedules, id: false, force: true do |t| 
     t.references :students, foreign_key: false 
     t.belongs_to :teachers 
     t.string :something_else 
     t.timestamps null: false 
    end 
    end 
end 

class AddStudensIdContraintToSchedules < ActiveRecord::Migration 
    def change 
    add_foreign_key :schedules, :students, primary_key: "unique_cooler_student_id" 
    end 
end 

class Schedule 
    has_many :students, primary_key: 'unique_cooler_student_id' 
end 

Таким образом, AR использует WHERE students.unique_cooler_student_id = 2 в запросе с соединением.

Единственная причина, по которой вам действительно хотелось бы это сделать, - это использовать устаревшую базу данных и не изменять схему базы данных.

+0

Насколько я знаю, вы не можете указать столбец внешнего ключа при использовании 't.belongs_to' или' .references', просто true/false. – max

Смежные вопросы