2017-02-22 1 views
0

Ich verwende Rails 5.0.1 für Web-Entwicklung und die Bereitstellung meiner App auf Heroku. Ich benutze postgreSQL als meine Datenbank.Wie ein Verweis auf Primärschlüssel der gleichen Tabelle zweimal in einer Tabelle in Postgre in Rails5

Ich habe eine Tabelle namens Benutzer und eine Tabelle namens Friends. In Freundes-Tabelle Ich möchte die Benutzer-ID zweimal speichern, zum Beispiel um anzuzeigen, dass Benutzer-ID 1 ist Freund der Benutzer-ID 2.

Wie kann ich das tun?

Bisher habe ich versucht, folgende Dinge ohne Erfolg:

Versuch 1:

Migrationsdatei:

create_table :friends do |t| 
    t.references :user, foreign_key: true 
    t.references :user, foreign_key: true 
    t.timestamps 
end 

Modell:

class Friend < ApplicationRecord 
    belongs_to :friend1, :foreign_key => :friend1_id, :class_name => 'User' 
    belongs_to :friend2, :foreign_key => :friend2_id, :class_name => 'User' 
end 

Versuch 2 :

Migrationsdatei:

create_table :friends do |t| 
    t.references :friend1_id, foreign_key: true 
    t.references :friend2_id, foreign_key: true 
    t.timestamps 
end 

Modell:

class Friend < ApplicationRecord 
    belongs_to :friend1, :foreign_key => :user_id, :class_name => 'User' 
    belongs_to :friend2, :foreign_key => :user_id, :class_name => 'User' 
end 

Gibt es etwas falsch mit der Art, wie ich es bin Modellierung? oder, kann dies besser/einfacher gemacht werden? Meine Anforderung ist es, Informationen über einen Benutzer und seine Freunde zu speichern. Ein Benutzer kann mehrere Freunde haben.

PS: Vor der Bereitstellung auf Heroku/PostgreSQL, habe ich die Anwendung auf meinem lokalen System mit sqlite3 ausgeführt, die Skripte schienen dort gut zu funktionieren, aber sie funktionieren jetzt nicht auf Heroku/PostgreSQL.

+0

Warum Sie nicht has_many Beziehung verwenden? Benutzer hat viele Freunde – 1Rhino

Antwort

1

Ich glaube, Sie haben meist die richtigen Stücke, sondern müssen sie rekombinieren, wie zB diese funktionieren sollte:

class Friend < ApplicationRecord 
    belongs_to :friend1, :foreign_key => :friend1_id, :class_name => 'User' 
    belongs_to :friend2, :foreign_key => :friend2_id, :class_name => 'User' 
end 

wenn Ihre Spalten friend_1/friend_2

create_table :friends do |t| 
    t.integer :friend1_id 
    t.integer :friend2_id 
    t.timestamps 
end 

sind Sie müssen möglicherweise manuell hinzufügen Fremdschlüssel obwohl ich glaube nicht, dass Rails die unterschiedlich benannten Schlüssel unterstützt.

Hinweis: Diese anderen beiden Dinge, die Sie ausprobiert haben, werden definitiv nicht funktionieren, da Rails user_id als mehrdeutig ... oder wiederholt vorfindet.

0

Ich habe eine Suche in Github, und das gefunden. Ich hoffe, hilfreich:

app/models/user.rb

has_and_belongs_to_many :friends, join_table: :friends_users 
has_many :outgoing_friend_requests, class_name: FriendRequest 
has_many :incoming_friend_requests, class_name: FriendRequest, 

foreign_key:

friend_id

app/models/Freund.rb

class Friend < ActiveRecord::Base 
    self.table_name = :users 

    has_and_belongs_to_many :users, join_table: :friends_users 
end 

app/models/friend_request.rb

class FriendRequest < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend 
end 

Hier wird die Repo Link

Verwandte Themen