2017-02-15 2 views
0

Я пытаюсь реализовать функцию ответа комментариев для своего проекта, однако я не очень уверен в использовании метода, который я использую. Моя основная идея - сохранить все комментарии в одной таблице, имея еще одну таблицу comments_replies, которая будет иметь родительский комментарий (комментарий) и комментарий (ответ). Теперь у меня есть что-то вроде этого является миграция comments_replies:Имея 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» в «Comment», который будет ссылаться на родительский комментарий в той же таблице. Для всех этих основных «комментариев» (которые не отвечают на какие-либо комментарии) столбец «parent_id» будет равен нулю.

Так что ваша модель будет выглядеть ниже

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 

С текущего подхода

Вы должны указать ассоциацию с двумя foreign_key, что неправильно. В вашей модели «Комментарий» вам нужна ассоциация. 1) для всех ответов на комментарий 2) Для получения родительского комментария.

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 

Кроме того, в модели CommentReply

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 и в модели комментариев: принадлежит_to: comment, foreign_key:: parent_id, class_name: 'Comment' еще одна вещь, в модели комментариев мне нужно написать что-то вроде: has_many: comments, foreign_key:: parent_id – Hatik

Смежные вопросы