mam taki problem:
Mam model Word, który przechowuje mi informacje o jakimś tam słowie kluczowym
Chciałbym utworzyć relację wiele do wielu:
między jednym słowem a drugim
czyli pewnie byłaby tu jakaś tabela typu word_word z polami word1, word2
Chciałbym mieć teraz dostęp z poziomu słowa do wszystkich słów z którymi dane słowo jest w relacji: word.next_words
oraz wszystkie słowa, które są w relacji z danym słowem: word.prev_words
między trzema słowami
tutaj bardziej skomplikowane i w sumie nie wiem jak to mogłoby być obsługiwane.
Generalnie chciałbym mieć uporządkowane trójki słów i potem móc wyszukiwać trzeciego słowa na podstawie dwóch słów początkowych.
Wiem, że mogę to zrobić w zwykłej tablicy z trzema polami i wszystko obsługiwać samemu, ale czy nie ma sposobu żeby jakoś to ułatwić?
To co opisujesz nie jest trywialne ale do zrobienia, generalnie uznaję że jest to graf skierowany (zresztą tak to wynika z opisu), dla grafu nie skierowanego rozwiązanie jest odrobinę trudniejsze.
Pola id, word
class Word < ActiveRecord::Base
has_many :next_word_relations, :foreign_key => ‘source_word_id’
has_many :next_words, :class_name => “Word”, :through => :next_word_relations
Ad 2) Wyszukuje wszystkie słowa które posiadają jako źródła wszystkie słowa jakie podasz w parametrze (rozwiązanie ogólne - zadziała bez problemu w każdej bazie danych obsługującej dobrze podzapytania - czyli postgresql, oracle, db2, i zdaje się najnowsze mysqle)
def self.find_by_related(words)
scoped(:select => ‘words.’, :from => ‘words’, :conditions => [’ (SELECT COUNT() FROM word_relations WHERE word_relations.source_word_id = IN (?) AND word_relations.destination_word_id = words.id) >= ?’, words.map(&:id), words.length])
end
end