2017-02-15 24 views
0

私は自分のプロジェクトにコメント返信機能を実装しようとしていますが、私が使っている方法ではあまりよく分かりません。私の基本的な考え方は、親コメント(コメント)とコメント(返信)を持つ別のテーブルcomments_repliesを持っている間、すべてのコメントを1つのテーブルに保持することです。今、私はこのような何かがcomments_repliesの移行であります同じテーブルレールにある1つのテーブルから2つの外部キーを持っている

create_table :comments_replies do |t| 
    t.integer :parent_comment_id, index: true, foreign_key_column_for: :comments, null: false 
    t.integer :reply_comment_id, index: true, foreign_key_column_for: :comments, null: false 
    t.timestamps null: false 
end 

とモデルcomments_reply.rb

belongs_to :comment, class_name: 'Comment' 

で、モデルcomment.rbにおける第二の場合と

has_many :comments_replies, foreign_key: :parent_comment_id, foreign_key: :reply_comment_id 

テストの目的でRSPECを使用しようとしているからです。comments_reply_spec.rbというモデルがあります。

require 'rails_helper' 

RSpec.describe CommentsReply, type: :model do 
    let(:comments_reply) { create(:comments_reply) } 
    subject { comments_reply } 

    it { is_expected.to respond_to(:parent_comment_id) } 
    it { is_expected.to respond_to(:reply_comment_id) } 
end 

が、私はあなたが達成しようとしているどのようなので、何か提案が

答えて

1

をいただければ幸い、適切にこのケースをテストする方法がわからないのですが、「コメント」モデル自体から行うことができます。同じ表の親コメントを参照する「コメント」に別の列「parent_id」が必要です。これらの主な「コメント」(コメントに返信されない)については、「parent_id」列はnullになります。

だからあなたのモデルは、あなたが間違っている2つのFOREIGN_KEYとの関連付けを指定する必要があり

class Comment 
    belongs_to :parent_comment, foreign_key: :parent_comment_id, class_name: 'Comment' 
    has_many :replies, foreign_key: :parent_comment_id, class_name: 'Comment' 
end 

あなたの現在のアプローチで

の下のようになります。あなたの "コメント"モデルでは、関連付ける必要があります。 1)コメントのすべての返信用2)親コメントの取得用。

あなたCommentReplyモデルでも
has_many :comments_replies, foreign_key: :parent_comment_id 
has_many :replies, through: :comment_replies 

has_one :parent_comment_reply, foreign_key: :reply_comment_id, class_name: 'CommentReply' 
has_one :parent_comment, through: :parent_comment_reply 

belongs_to :parent_comment, foreign_key: :parent_comment_id, class_name: 'Comment' 
belongs_to :reply_comment, foreign_key: :reply_comment_id, class_name: 'Comment' 

あなたのスペックは

require 'rails_helper' 

RSpec.describe CommentsReply, type: :model do 
    let(:parent_comment){ create(:comment) } 
    let(:child_comment) { create(:comment) } 

    let(:comment_reply) { create(:comment_reply, parent_comment_id: parent_comment.id, reply_comment_id: child_comment.id) } 

    subject { comment_reply } 

    it { is_expected.to respond_to(:parent_comment_id) } 
    it { is_expected.to respond_to(:reply_comment_id) } 

    it "should correctly identify the parent/child relationship" do 
    expect(comment_reply.reply_comment.id).to be_eql(child_comment.id) 
    expect(comment_reply.parent_comment.id).to be_eql(parent_comment.id) 
    end 

end 
+0

以下のようになります。しかし私は、どのようにすべき、私はそれが簡単になるとはるかに便利だろうと信じて、提案されたアプローチを逃しました私は移行とモデルでそのparent_idフィールドを指定しますが、単純にマイグレーションで書いても大丈夫ですか? t.integer:parent_id、index:true、foreign_key_column_for::comments、null:false 0123コメントモデル: has_many:comments、foreign_key::parent_idコメントを追加するには、次のように記述してください:コメント:foreign_key – Hatik