在Rails中自我引用了很多

时间:2011-11-15 12:19:36

标签: ruby-on-rails ruby-on-rails-3

我在Rails中阅读过很多关于自引用类的内容,但是仍然无法让它们工作。

我有一类文章,我希望他们能够互相引用,从源文章到结果文章 - 然后能够找到相反的结果。所以我正在尝试使用另一个名为Links的类来完成has_many。

我的架构是

  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将文章链接在一起,但链接表只存储outcome_id,而不是source_id。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

我最终让这个工作了。我更改了名字 - 我不知道这是否重要。我确实在某个地方读到了这个源是一个愚蠢的名字用于某事。

所以这是有效的:

我的架构

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