2016-07-28 17 views
0

は私が 外部キーレール、追加方法?

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

が作成したときFOREIGN_KEYを追加するのを忘れなければならないのよりシンプルにするために、今私は、特定の(has_manyの経由)関連

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

あなたは 'デシベル/ schema.rb'を投稿することができますか? – siegy22

+0

他のモデルではuser_idを意味します –

+0

RaVeN 'code'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 –

答えて

0

コンソールに

rails g migration AddForeignKeyToVotes user:references question:references 
を、このコマンドを実行します。

これは、以下の内容

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

問題は外来キーが必要です。私は初心者ですが、私は何かを理解していないかもしれません。しかし、この追加の目的は、has_many:questionsを持たなければならないエイリアスを作成することです。それらを分離するために名前付きの外部キーを追加したいとします。 –

0

db/migrate/xxxx_add_foreign_key_to_votes.rbファイルが生成されます、あなたが本当に外部キーを必要としていますか?

多くのRails開発者は、Railsがデータベースではなくアプリケーション内の関係を処理する方法に満足しています。あなたのケースのための

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

エンド

場合votesテーブルありquestion_id、あなたは理由がない限り、いかなる外部キーなしで関係を定義するのに十分であると本当にこの外部キーが必要user_id定義されたデータベースレベル。

THIS SECTIONをよく読んで、RailsはConvention over Configurationを使用しています。

Userモデルでは、どのテーブルをクエリしてデータを取得するかを設定なしで同じ名前のテーブルusers(表記)を検索し、それを外部キーと同じように使用します。

あなたのコメントによるとあなたは、StackOverflowのようにモデルの何かを持っているあなたはQuestionを求めることができ、あなたが何かのように持っていることがあり、この場合Question答えることができUserあります

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 

データベースが何かになりますが以下のように:

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

のは、あなたがQuestionsユーザーを取得したいとしましょう、それはなります彼らに尋ねた:

user = User.first 
user.asked_questions 

あなたがQuestionsユーザーの票を取得したい場合:

user.voted_questions 
+0

mohamed-ibrahim私は分離を扱うために必要です。私は間違った方向に行っているかもしれませんが、私は有権者/著者としての質問に対処したい/これらは異なる団体です –

+0

@ anti-k私の更新された回答を確認してください –

+0

mohamed-ibrahimありがとうたくさんの男! –

関連する問題