2

Я использую Rails 5.0 с Postgresql 9.5Как добавить составные первичные ключи в db с помощью Rails?

Мне нужно добавить составные первичные ключи к моей модели «User_achievement» (чтобы, как вы можете догадаться, использовать модели «Пользователь» и «Достижения»).

Итак, я попытался использовать драгоценный камень «composite_primary_keys». Я следовал всем инструкциям, но результат не был таким, каким я ожидал. Кажется, что это не создает PKEY в таблице «user_achievement» в соответствии с информацией по PSQL инструмента:

test1_development=> \d user_achievements 

Table "public.user_achievements" 
Column | Type | Modifiers 

----------------+---------+----------- 

user_id | integer | 
achievement_id | integer | 
uach_date | date | 

Indexes: 

"index_user_achievements_on_achievement_id" btree (achievement_id) 

"index_user_achievements_on_user_id" btree (user_id) 

Foreign-key constraints: 

"fk_rails_4efde02858" FOREIGN KEY (user_id) REFERENCES users(id) 

"fk_rails_c44f5b3b25" FOREIGN KEY (achievement_id) REFERENCES achievements(id) 

Вот модели и код Миграции:

class CreateUsers < ActiveRecord::Migration[5.0] 
def change 
    create_table :users do |t| 
    t.string :name 
    end 
end 
end 

class CreateAchievements < ActiveRecord::Migration[5.0] 
def change 
    create_table :achievements do |t| 
    t.string :ach_name 
    t.text :ach_desc 
    end 
end 
end 

class CreateUserAchievements < ActiveRecord::Migration[5.0] 
    def change 
    create_table :user_achievements, id: false do |t| 
    t.belongs_to :user, :foreign_key => [:id] 
    t.belongs_to :achievement, :foreign_key => [:id] 
    t.date :uach_date 
    end 
    end 
end 


class Achievement < ApplicationRecord 
    has_many :user_achievements 
end 

class User < ApplicationRecord 
    has_many :user_achievements 
end 

class UserAchievement < ApplicationRecord 
    self.primary_keys = :user_id, :achievement_id 
    belongs_to :user, :foreign_key => [:id] 
    belongs_to :achievement, :foreign_key => [:id] 
end 

Так должны камень изменения db таблицы? или это влияет только на окружающую среду рельсов? Есть ли единственный способ изменить db - добавить выполнить строка в миграции?

ответ

1

Поскольку никто не опубликовал ничего полезного, я поделюсь тем, что у меня есть.

Gem 'composite_primary_key' (CPK) ничего не меняет в базе данных, поэтому, если вы все еще это хотите, вы должны сделать это вручную (добавьте команду в миграцию).

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

В любом случае, я считаю, что очень сложно и сложно использовать составные первичные ключи в приложениях rails, потому что это делает использование других драгоценных камней достаточно нервным (с каждой новой установкой gem вы помните, что где-то что-то может пойти не так), а также сменив ваш код на cpks в будущем. Также это затрудняет понимание кода для других людей, которые не знакомы с этой функцией. Поэтому вы всегда должны указать, что вы использовали CPK.

Очень хорошая альтернатива - это добавление индекса с уникальной опцией, которая технически означает совершенно то же самое, но не требует дополнительной головной боли.

Так что используйте его только в том случае, если вам действительно нужно, и нет другого пути!

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