2

私は、PostgreSQL 9.5私は(リンク「ユーザー」とあなたが推測し得るような「達成」モデルへの)私のモデル「User_achievement」に複合主キーを追加する必要性によRailsを使って複合主キーをdbに追加するには?

でのRails 5.0を使用しています。

私は "composite_primary_keys"宝石を使ってみました。私はすべての指示に従ったが、結果は私が期待した通りではなかった。

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 

ので、宝石は変更する必要があり、それはPSQLツールで情報によると「user_achievement」テーブルにPKEYを作成しないように思えますdbテーブル?レールの環境だけに影響しますか? dbを変更する唯一の方法はありますか?を追加するには、移行時に行を実行しますか?

答えて

1

誰も有用なものを投稿していないので、私が今までに得たものを共有します。

Gem 'composite_primary_key'(CPK)はデータベース内の何も変更しないので、必要な場合は手動で行う必要があります(移行時にコマンドを追加してください)。

CPKが行う唯一の事柄は、もともとは持っていないし、エラーを表示するので、複合主キーが何であるかを「理解」することでレールを拡張することです。

とにかく、レールのアプリに複合主キーを使用するのは非常に洗練されていて、問題があることがわかった。それは他の宝石を使っているのでかなり痛い。将来はcpksでコードを変更します。また、この機能に慣れていない他の人には、コードを理解させるのが難しくなります。だから、あなたはいつもあなたがCPKを使ったことを明記するべきです。

非常に良い選択肢は、技術的に全く同じであるが追加の頭痛を必要としない「ユニーク」オプション付きのインデックスを追加することです。

あなたが実際に持っている必要がある場合にのみ、それを使用してください。

関連する問題