2011-11-15 20 views
2

私はRailsの自己参照クラスについて多くのことを読んだことがありますが、引き続き問題を起こしています。自己参照has_many through in Rails

私は記事のクラスを持っていて、ソースの記事から結果の記事まで、互いに参照できるようにして、その逆を見つけることができるようにします。ですから、私はhas_manyを通して、Linksという別のクラスを使ってやろうとしています。

私のスキーマが

create_table "articles", :force => true do |t| 
    t.string "name" 
    t.text  "body" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "links", :force => true do |t| 
    t.integer "source_id" 
    t.integer "outcome_id" 
    t.string "question" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

モデルは

class Article < ActiveRecord::Base 
    has_many :links_as_source, :foreign_key => "source_id", :class_name => "Link" 
    has_many :sources, :through => :links_as_source 

    has_many :links_as_outcome, :foreign_key => "outcome_id", :class_name => "Link" 
    has_many :outcomes, :through => :links_as_outcome 
end 

class Link < ActiveRecord::Base 
    belongs_to :source, :foreign_key => "source_id", :class_name => "Article" 
    belongs_to :outcome, :foreign_key => "outcome_id", :class_name => "Article" 
end 

ているされて私は、コンソールで記事を作成することができ、私はa.outcomes << bを使用して、一緒に記事をリンクすることができますが、リンクテーブルはsource_idではなくoutcome_idのみを格納しています。

私は間違っていますか?

+0

a.outcomes << B'あなたは 'a.save'を呼び出している'呼び出した後? –

+0

私はこれを最後に働かせました。私は名前を変更しました - それが重要かどうかわかりません。私はどこかでソースが何かのために使う馬鹿な名前だったと読んだ。 これはうまくいきます: create_table "article_relationships"、:force => true do | t | t.integer "PARENT_ID" t.integerは ... エンド CREATE_TABLE "記事"、 "child_id":力=>真DOを| T | t.string "name" ... end – Edward

答えて

2

私はこれを最後に働かせました。私は名前を変更しました - それが重要かどうかわかりません。私はどこかでソースが何かのために使う馬鹿な名前だったと読んだ。

だから、これはどのような作品です:

マイスキーマ

create_table "article_relationships", :force => true do |t| 
    t.integer "parent_id" 
    t.integer "child_id" 
    ... 
end 

create_table "articles", :force => true do |t| 
    t.string "name" 
    ... 
end 

記事のマイ・モデル

has_many :parent_child_relationships, 
      :class_name  => "ArticleRelationship", 
      :foreign_key => :child_id, 
      :dependent  => :destroy 
has_many :parents, 
      :through  => :parent_child_relationships, 
      :source   => :parent 

has_many :child_parent_relationships, 
      :class_name  => "ArticleRelationship", 
      :foreign_key => :parent_id, 
      :dependent  => :destroy 
has_many :children, 
      :through  => :child_parent_relationships, 
      :source   => :child 
+0

これは私に時間と時間を節約し、答えとして設定する必要があります。どうもありがとうございます! 私は自己参照のための解決策を見つけることができた多くのスルー、親から行くが、子供に協会を働かせるために困惑した。これはそれを素晴らしく解決しました! –

+1

は「kung pao」より美味しい –