开发者

rails many to many self join

could some one point me to the right direction:

I try to build a model for rails that build up the following:

ClassA -id

ClassA has a relation to many "ClassA" (so it is a reference to itself)

I am searching for the migration and the model.

I a not sure what the correct join table is (I think its a simple 2 columns table ClassA开发者_Go百科_id, ClassARel_ID -> both point to ClassA) and how to build the model

Thanks!


I'd use something like

class Person < ActiveRecord::Base
   has_many :friendships, :foreign_key => "person_id", 
      :class_name => "Friendship"

   has_many :friends, :through => :friendships
end

class Friendship < ActiveRecord::Base
   belongs_to :person, :foreign_key => "person_id", :class_name => "Person"
   belongs_to :friend, :foreign_key => "friend_id", :class_name => "Person"  
end

And the tables would be like

people: id; name; whatever-you-need    
friendships: id; person_id; friend_id


If it doesn't make too much sense to create another class to join the two, an alternative approach could be:

class Word < ActiveRecord::Base 
  has_and_belongs_to_many :synonyms, class_name: "Word", 
                                     join_table: "word_synonyms",
                                     association_foreign_key: "synonym_id"
end

The join table would look like this:

create_table :word_synonyms do |t|
  t.integer :word_id
  t.integer :synonym_id
end


Unfortunately whistler's answer might not be suitable in many cases. For instance, it doesn't work both ways. For instance, suppose you create a new word:

word = Word.create(:word_name => 'tremble')
['shake', 'vibrate'].each { |syn| word.synonyms.create(:word_name => syn) }

Now, if you do:

word = Word.find_by_word_name('tremble')
p word.synonyms # this would print out the Words with the word_name 'shake' and 'vibrate'.

however, if you did it the other way around:

word = Word.find_by_word_name('vibrate')

p word.synonyms # this would print an empty association.

This is saying the word 'vibrate' has NO synonyms.

So basically, this method won't work both ways (i.e. vibrate is a synonym of tremble, and tremble is a synonym for vibrate)

Edit: In a sense, you could use this approach, however, you would have to explicitly assign the synonyms for each word. So although you specified synonyms of tremble (which are 'vibrate' and 'shake'), you would have to still specify synonyms of 'shake' ('which are 'tremble' and 'vibrate') and 'vibrate' (which are 'tremble' and shake') as well.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜