0

私はRuby on Railsで "Answer"というモデルを持っているクイズアプリを作っています。今、私は、ユーザーがデータベースへの質問のために与えられる答えを保存する必要があるので、私は、私は属性として、これらの既存のモデルとモデル「GivenAnswer」と一致するコントローラ作ってあげると思った:Rails - "Given Answer"をデータベースに保存する最も良い方法は?

  • 「ユーザー」

  • 私は「GivenAnswerに与えられた答えを分析するためのすべてのロジックを置くつもりだ「質問」

  • 「回答」

sのコントローラーを使用していますが、dbマイグレーションの外観はわかりません。また、「ユーザーごとの回答」と「質問ごとの回答」が頻繁に表示されるため、「ユーザー」と「質問」にインデックスを付けることができます。私はこの移行に生成:

class CreateGivenAnswers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :given_answers do |t| 
     t.references :user, foreign_key: true 
     t.references :question, foreign_key: true 
     t.references :answer, foreign_key: true 

     t.timestamps 
    end 
    end 
end 

をしかし、テーブルではなく、純粋にリレーショナルべきである場合、私は思ったんだけど:

class CreateGivenAnswers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :given_answers, id:false do |t| 
     t.belongs_to :user, index: true 
     t.belongs_to :question, index: true 
     t.belongs_to :answer 
    end 
    end 
end 

私はRailsの初心者ですので、私は任意のポインタに感謝するだろう。

+0

に関連付けることは理にかなっています。 –

+0

チップありがとう@Imran – megahra

答えて

1

belongs_toは、referencesの別名ですので、どちらを使用しても違いはありません。

この場合、id列を削除しないでください。

任意の外部キーもインデックスである必要があります。

私はこれを行うだろう:

class CreateGivenAnswers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :given_answers, id:false do |t| 
     t.references :user, index: true, foreign_key: true 
     t.references :question, index: true, foreign_key: true 
     t.references :answer, index: true, foreign_key: true 
    end 
    end 
end 

しかし、私はあなたがGivenAnswerに直接Answerを関連付けるべきであるとは思いません。もしあなたが `rails5`でも` ruby​​-on-rails-5`を追加して作業しているのであれば、AnswerQuestion

+0

ありがとう@トビー、それは意味をなさない。 'Answer'は* to 1の関係を持つ' Question'に関連しています。なぜ私は 'GivenAnswer'に' Answer'を関連付けるべきではないと言いますか? – megahra

+0

質問には複数の回答があり、回答には複数の質問がありますか? 'Answer'が' Question'に関連し、 'Question'が' GivenAnswer'に関連する場合、 'GivenAnswer'は' Question'を通じて 'Answer'にアクセスできます。 'Answer'を直接参照すると、データベースレベルで矛盾の可能性が残されます。 –

+0

たとえば、質問の回答が変更されたが、その質問の回答にリンクされた回答が変更されなかった場合はどうなりますか?それで、質問Aの正解はXになりましたが、質問Aの回答オブジェクトは正しい答えがYであると言っています。データベースレベルの不一致は、あなたのアプリケーションを保守不能にします。ロングラン。 –

関連する問題