2012-02-12 16 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 

或查找後的父:

@parent_post = post.parent_post 

這可能都是一些語法誤解。所以,先感謝任何能給我帶來一些意識的人。我已經瀏覽了每篇SO和博客文章,並且沒有嘗試使用「指南」中描述的單一模型自引用自連接方法。

任何人提供的解釋沒有指向使用單獨關係表的Friendly Friend示例的積分。

+0

它會更容易,如果你所描述的是/沒有發生你所期望的方式上手。此外,像'act_as_tree'是單表,單一模式的自我指涉的 - 你有沒有考慮在尋找類似的東西? – 2012-02-12 16:55:46

+0

我以爲我做到了。我期待能夠調用post.replies,並得到一組是基於父後填充後的實例,通過它的parent_post_id = POST_ID。 – garlicman 2012-02-12 17:00:42

+0

這解釋了你做了什麼。沒有發生什麼事。 – 2012-02-12 17:02:50

回答

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到不同的職位,後來得到是的答覆任何父帖子所有帖子。