I’ve read lots about self referential classes in Rails, but am still having problems getting them working.
I have a class of Articles and I want them to be able to refer to each other, from a source article to an outcome article – and then be able to find the reverse. So I’m trying to do a has_many through, using another class called Links.
My schema is
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
The models are
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
and
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
I can create articles in the console, and I can link articles together, using a.outcomes << b but the link table is only storing the outcome_id, not the source_id.
What am I doing wrong?
I got this to work in the end. I changed the names – I don’t know if that mattered. I did read somewhere that source was a silly name to use for something.
So this is what works:
My schema
My article model