2012-02-12 5 views
12

Railsで単一のモデル自己結合を実装する方法を理解するのは苦労しています。 Guide to ActiveRecord Associations section 2.10はセルフ・ジョインについて簡単に説明していますが、十分な情報を提供していません。この例に関するすべての例またはポストは、Rails Guide section 2.10で説明されているように、Railsの理解ActiveRecordの "単一モデル"自己結合

アイデアは、関係のための別のテーブルを必要とせずに、has_manyとbelongs_to自体のモデルです。別のテーブルを必要とするために私が見る唯一の理由は、関係に単なる関係よりも多くの情報が含まれるようにするためです。例えば「親友」、私はシンプルなポストスキーマを持っている

を「やっと彼らを知っている」:

create_table "posts", :force => true do |t| 
    t.datetime "posted" 
    t.string "nick" 
    t.string "title" 
    t.text  "content" 
    t.integer "parent_post_id" 
    t.datetime "created_at",  :null => false 
    t.datetime "updated_at",  :null => false 
end 

parent_post_idは、他のポストpost_idの年代に自己参照です。 posts.rbモデルが定義された関係を持っています

class Post < ActiveRecord::Base 
    has_many :replies, :class_name => "Post" 
    belongs_to :parent_post, :class_name => "Post", 
    :foreign_key => "parent_post_id" 
end 
コントローラーで

または私はこのような何かを行うことができるように願っています見る:

@posts.each do |post| 
    ... 
    @replies = post.replies 
    @replies.each do |reply| 
    ... 
    end 
end 

またはPOSTの親を見つける:

@parent_post = post.parent_post 

これは構文が誤っている可能性があります。だから私にいくつかの意味を打つことができる誰にも事前に感謝します。私はSOとブログの投稿をすべて見てきましたが、ガイドに記載されている単一モデルの自己参照自己結合メソッドを試してみません。

別の関係テーブルを使用するフレンドリーフレンドの例を指していない説明を提供する人のためのポイント。

+0

期待どおりのことが起こっているかどうかを記述しておけば、簡単に始めることができます。また、 'act_as_tree'のようなものは、単一テーブル、単一モデルの自己参照型です。あなたはそのようなものを見ることを考えましたか? –

+0

私は思った。私は、post.repliesを呼び出して、parent_post_id = post_idによって、親投稿に基づいて作成された一連のPostインスタンスを取得できることを期待していました。 – garlicman

+0

それはあなたがしたことを説明します。何が起こったか –

答えて

23

私は "parent_post_id"にhas_many外部キーがありませんでした。 post.repliesが設定されると、parent_post_idによって他のPostインスタンスを参照します。

posts.rbモデルが定義された関係を持っています

class Post < ActiveRecord::Base 
    has_many :replies, :class_name => "Post", 
    :foreign_key => "parent_post_id" 
    belongs_to :parent_post, :class_name => "Post", 
    :foreign_key => "parent_post_id" 
end 

私は今、記事を作成し、別のポストにparent_post_idを割り当て、その後の任意の親のポストへの返信であるすべての記事を取得することができます。