2

Ich benutze Rails 5.0 mit Postgresql 9.5Wie fügen Sie zusammengesetzte Primärschlüssel in db mit Rails?

Ich bin zu meinem Modell 'User_achievement' hinzufügen Composite Primärschlüssel hinzufügen (um 'Benutzer' und 'Achievement' Modelle zu verknüpfen, wie Sie erraten können).

Also habe ich versucht, die "composite_primary_keys" gem. Ich habe alle Anweisungen befolgt, trotzdem war das Ergebnis nicht so, wie ich es erwartet hatte.

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) 

Ist hier Modelle und Code Migrationen: Scheint, wie es pTaste in der ‚user_achievement‘ Tabelle nicht durch psql Werkzeug gemäß der Info erstellen

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 

sollte also das Juwel ändern DB-Tabellen? oder es beeinflusst nur die Umgebung der Schienen? Gibt es die einzige Möglichkeit, db zu ändern - Zeile in Migration hinzufügen?

Antwort

1

Da niemand etwas Nützliches gepostet hat, werde ich teilen, was ich jetzt habe.

Gem 'composite_primary_key' (CPK) ändert nichts in der Datenbank, also wenn Sie es immer noch wollen - Sie sollten es manuell tun (fügen Sie den Befehl in der Migration hinzu).

Das einzige, was CPK tut, ist die Erweiterung von Schienen, die "verstehen", was ein zusammengesetzter Primärschlüssel ist, da er ursprünglich keinen Fehler aufweist und einen Fehler aufweist.

Wie auch immer ich fand es sehr sophisticated und problematisch, zusammengesetzte Primärschlüssel in Rails 'Apps zu verwenden, weil es die Verwendung anderer Edelsteine ​​ziemlich nervig macht (bei jeder Neuinstallierung merkt man, dass irgendwo etwas schiefgehen kann) Ändern Sie Ihren Code mit Cpks in Zukunft. Außerdem macht es Ihren Code schwieriger für andere Leute zu verstehen, die mit dieser Funktion nicht vertraut sind. Sie sollten also immer angeben, dass Sie CPK verwendet haben.

Eine sehr gute Alternative ist das Hinzufügen eines Indexes mit der Option "unique", was technisch gleichbedeutend ist, aber keine zusätzlichen Kopfschmerzen erfordert.

Also benutzen Sie es nur, wenn Sie wirklich müssen und es gibt keinen anderen Walkaround!

Verwandte Themen