2016-12-27 3 views
0

私はブログアプリを設計しています。ブログ投稿には多くのコメントがあり、ユーザーはコメントを書くときに前のコメントに返信することができます。この "replies_to"関係をどのようにモデル化できますか?
私には、「has_one」というコメントが返信先のコメントである「reply-to」コメントのようです。そこで、私はcommentsテーブルに "replies_to"フィールドを追加しました。私は次のコードを書いたが、うまくいかなかった:Railsの "one comment replies_to another"関係をモデル化するには?

# in migration 
class CreateComments < ActiveRecord::Migration[5.0] 
    def change 
    create_table :comments do |t| 
     t.string :body 
     t.references :blog, foreign_key: true 
     t.references :user, foreign_key: true 
     t.references :replies_to, references: :comments, foreign_key: true 

     t.timestamps 
    end 
    end 
end 


# in model class 
has_one :replies_to 

どうやってこの関係をモデル化できますか?

答えて

0

2つの回答が考えられます。

解決方法1:

has_one関係は、(あなたのケースのREPLY_TOに)参照のモデルが外部キーを持つことを意味します。この場合、あなたの意図は正しいですが、構文が間違っています。代わりにこれを試してみてください:

def change 
    add_reference :reply_tos, :comment, foreign_key: true 
end 

ソリューション2(推奨):

あなたが説明した相互作用に基づいて、私はあなたがすべてでreply_tosのテーブルを持っているべきだと思いますが、むしろcommentsにフィールドを作成しないでくださいテーブルはparent_idのようなものです。このようにして、ユーザーが既存のコメントに返信したい場合、フィールドparent_idに、返信しているコメントのIDを入力します。少なくとも私は私が思っている

class Comment < ActiveRecord::Base 
    belongs_to :parent, :class_name => "Comment", :foreign_key => "parent_id" 
    has_many :children, :class_name => "Comment", :foreign_key => "parent_id" 
end 

:あなたの移行は代わりに限り、これはあなたのモデルコードからどのように見えるか、私はこのような何かのために行くだろうと...このよう

def change 
    add_column :comments, :parent_id, :integer 
    add_foreign_key :comments, :comments, column: :parent_id 
end 

を見てしまいますあなたを正しい方向に導いた!

+0

申し訳ありませんが、私は前に自分自身をはっきりと表現していませんでした。コメント欄の "replies_to"フィールドを作成しました。しかし、あなたは正しい方向を私に指摘しました。私の構文が間違っているようです。 "has_one:replies_to、:class_name =>:Comment、:foreign_key =>" replies_to_id "という行に変更しました。私は単純な一方向の関係は "1対多数"の関係よりも良いと思うので、belongs_toとhas_many節はありません。私はこの権利をしていますか? –

+0

私は元の意図がreplies_toを 'comments'テーブルの列として使うことを知りませんでした。私と同じようにあなたのマイグレーションで同じことをしたように見えますが、別のやり方です。 't.references:replies_to、references::comments、foreign_key:true'は' t.integer:replies_to_id'と 't.foreign_key:comments、column::replies_to_id'を書くより短い方法のようです。唯一の違いは、私は 'parent'を使い、あなたは' replies_to'を使いました。あなたのモデルでは、この場合、 'belongs_to'と' has_one'は互換性があると思います。 – arpie

+0

ええ、ありがとう! –

関連する問題