2016-07-28 35 views
0

Um einfacher zu machen ichFremdschlüssel, wie hinzufügen?

haben
class User 
    has_many :questions, trough: votes 
    has_many :questions  #(as the author) 
    has_many :votes 
end 

foreign_key hinzuzufügen vergessen, wenn erstellt, jetzt weiß ich nicht, wie es zu spezifischen hinzufügen (has_many durch) Verein

schema.rb

enable_extension "plpgsql" 

    create_table "answers", force: :cascade do |t| 
    t.text  "body" 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 
    t.integer "question_id" 
    t.integer "user_id" 
    t.boolean "best",  default: false 
    end 

    add_index "answers", ["question_id"], name: "index_answers_on_question_id", using: :btree 
    add_index "answers", ["user_id"], name: "index_answers_on_user_id", using: :btree 

    create_table "attachments", force: :cascade do |t| 
    t.string "file" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.integer "attachable_id" 
    t.string "attachable_type" 
    end 

    add_index "attachments", ["attachable_id", "attachable_type"], name: "index_attachments_on_attachable_id_and_attachable_type", using: :btree 

    create_table "questions", force: :cascade do |t| 
    t.string "title" 
    t.text  "body" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    end 

    add_index "questions", ["title"], name: "index_questions_on_title", using: :btree 
    add_index "questions", ["user_id"], name: "index_questions_on_user_id", using: :btree 

    create_table "users", force: :cascade do |t| 
    t.string "name" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.inet  "current_sign_in_ip" 
    t.inet  "last_sign_in_ip" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree 
    add_index "users", ["name"], name: "index_users_on_name", unique: true, using: :btree 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 

    create_table "votes", force: :cascade do |t| 
    t.integer "votable_id" 
    t.string "votable_type" 
    t.integer "user_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "votes", ["user_id", "votable_id"], name: "index_votes_on_user_id_and_votable_id", unique: true, using: :btree 

    add_foreign_key "answers", "questions", on_delete: :cascade 
    add_foreign_key "questions", "users", on_delete: :cascade 
end 
+0

Können Sie Ihre 'db/schema.rb' posten? – siegy22

+0

meinst du user_id in anderen Modellen –

+0

RaVeN 'code'create_table "Stimmen", force:: Kaskade do | t | t.integer "votable_id" t.string "votable_type" t.integer "benutzer_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false Ende –

Antwort

0

Führen Sie diesen Befehl auf der Konsole

rails g migration AddForeignKeyToVotes user:references question:references 

Dies wird eine xxxx_add_foreign_key_to_votes.rb Datei unter db/migrate/ mit folgendem Inhalt

class AddForeignKeyToVotes < ActiveRecord::Migration 
    def change 
    add_reference :votes, :user, index: true, foreign_key: true 
    add_reference :votes, :question, index: true, foreign_key: true 
    end 
end 
+0

Die Sache ist, ich brauche einen Fremdschlüssel in Frage. Ich bin ein Anfänger, und vielleicht verstehe ich nicht etwas. Aber der Zweck dieses Hinzufügens ist, einen Alias ​​zu machen, weil ich has_many: questions habe, und ich möchte einen named Fremdschlüssel hinzufügen, um sie zu trennen. –

0

Sind Sie generieren müssen Fremdschlüssel wirklich?

Viele Rails-Entwickler sind mit der Art und Weise vertraut, wie Rails Beziehungen in der Anwendung statt in der Datenbank verarbeitet.

für Ihren Fall:

class User 
    has_many :questions, trough: votes 
    has_many :questions  #(as the author) 
    has_many :votes 

Ende

wenn votes Tabelle hat question_id und user_id, die ausreicht, um die Beziehung ohne Fremdschlüssel zu definieren, es sei denn, Sie haben einen Grund und wirklich brauchen diese Fremdschlüssel zu definierende Datenbankebene.

Lesen Sie THIS SECTION sorgfältig, Schienen verwendet Convention over Configuration. Als kleines Beispiel: Wie Ihr User Modell weiß, in welcher Tabelle die Daten abgefragt und abgerufen werden sollen, ohne irgendeine Konfiguration sucht sie nach einer Tabelle mit dem gleichen Namen users (Konvention) und verwendet sie, ebenso für Fremdschlüssel.

nach Ihren Kommentar Sie ein Modell etwas wie Stackoverflow haben, haben Sie eine User, die eine Question stellen können und eine Question in diesem Fall beantworten können Sie so etwas wie haben:

class User 
    has_many :asked_questions, class_name: 'Question' # user can ask many questions 
    has_many :voted_questions, through: :votes, source: 'question' 
    has_many :votes # to get all votes this user did 
end 

class Question 
    has_many :votes # to get all votes for a question 
    belongs_to :user 
end 

class Vote 
    belongs_to :user 
    belongs_to :question 
end 

Datenbank wird etwas wie:

# Table User 
# Table Question (user_id) 
# Table Vote (user_id, question_id) 

Angenommen, Sie Questions Benutzer gefragt, bekommen sie es sein wird:

user = User.first 
user.asked_questions 

wenn Sie Questions die Benutzer Stimmen erhalten möchten:

user.voted_questions 
+0

mohamed-ibrahim Ich brauche das für die Adressierung der Trennung. möglicherweise gehe ich in die falsche Richtung, aber ich möchte Fragen als der Autor und Fragen als der Wähler/Diese sind verschiedene Verbände –

+0

@ Anti-k überprüfen meine aktualisierte Antwort –

+0

mohamed-ibrahim Vielen Dank Mann! –