Der Versuch, Sarah-Lösung stieß ich auf zwei Fragen zu implementieren:
Zum einen die Lösung nicht arbeiten zu wollen, wenn Synonyme zuweisen von
tun
word.synonyms << s1 or word.synonyms = [s1,s2]
Auch das Löschen Synonyme indirekt nicht richtig funktioniert . Dies liegt daran, dass Rails die Rückrufe nach_save_on_create und after_destroy nicht auslöst, wenn die Link-Datensätze automatisch erstellt oder gelöscht werden. Zumindest nicht in Rails 2.3.5, wo ich es ausprobiert habe.
Dies kann durch Verwendung festgelegt werden: after_add und: after_remove Rückrufe im Modell Wort:
has_many :synonyms, :through => :links,
:after_add => :after_add_synonym,
:after_remove => :after_remove_synonym
Wo die Rückrufe Sarah Methoden sind leicht angepasst:
def after_add_synonym synonym
if find_synonym_complement(synonym).nil?
Link.new(:word => synonym, :synonym => self).save
end
end
def after_remove_synonym synonym
if complement = find_synonym_complement(synonym)
complement.destroy
end
end
protected
def find_synonym_complement synonym
Link.find(:first, :conditions => ["word_id = ? and synonym_id = ?", synonym.id, self.id])
end
Die zweite Ausgabe von Sarah Lösung ist, dass Synonyme, die andere Wörter bereits haben, wenn sie mit einem neuen Wort verbunden sind, nicht zu dem neuen Wort hinzugefügt werden und umgekehrt. Hier ist eine kleine Änderung, die dieses Problem behebt und stellt sicher, dass alle Synonyme einer Gruppe werden immer auf alle anderen Synonyme in dieser Gruppe verknüpft:
def after_add_synonym synonym
for other_synonym in self.synonyms
synonym.synonyms << other_synonym if other_synonym != synonym and !synonym.synonyms.include?(other_synonym)
end
if find_synonym_complement(synonym).nil?
Link.new(:word => synonym, :synonym => self).save
end
end
Die automatische Erstellung der komplementären Verbindung ist sehr nützlich, um die Verbindungen gültig zu halten. Obwohl ich zustimme, dass es kein guter Stil ist, Zahlen als Suffixe zu verwenden, ersetzen sie sie durch "word_id" & "synyn_word_id" nur durch Semantik, nein? Danke für Ihre gründliche Antwort. – sdfx
Sie können es als Word_1 und Word_2 in der Links-Tabelle behalten, wenn Sie wollen - was ich meinte, wenn Sie zwei * Assoziationen * mit numerischen Suffixen haben, bedeutet es normalerweise, dass Sie refactorieren sollten. Mein Code führt Sie von zwei Gruppen von Assoziationen zu einer. –
has_many: Synonyme funktionieren nicht, da Sie in Ihrem Link-Modell keine Assoziation definieren, die als Synonym bezeichnet wird. Bitte zerlegen Sie auch verschiedene Modelle in verschiedene Codeabschnitte. –