Попытка реализовать решение Сары я наткнулся на 2 вопроса:
Во-первых, решение не работает, когда требуется назначить синонимы, делая
word.synonyms << s1 or word.synonyms = [s1,s2]
Также удаление синонимов косвенно не работает должным образом , Это связано с тем, что Rails не запускает обратные вызовы after_save_on_create и after_destroy, когда он автоматически создает или удаляет записи Link. По крайней мере, не в Rails 2.3.5, где я его пробовал.
Это может быть исправлено с помощью: after_add и: after_remove обратных вызовов в модели Word:
has_many :synonyms, :through => :links,
:after_add => :after_add_synonym,
:after_remove => :after_remove_synonym
Где обратные вызовы методы Сары, слегка скорректированные:
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
Второй выпуск Сары решение состоит в том, что синонимы, которые другие слова уже имеют при соединении с новым словом, не добавляются к новому слову и наоборот. Вот небольшая модификация, которая устраняет эту проблему и гарантирует, что все синонимы группы всегда связаны со всеми другими синонимами в этой группе:
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
Автоматическое создание дополнительной ссылки действительно полезно для поддержания правильности соединений. Хотя я согласен с тем, что не использовать стиль в качестве суффиксов, заменив их словами «word_id» и «synonymous_word_id» - это просто семантика, нет? Благодарим вас за подробный ответ. – sdfx
Вы можете сохранить его как word_1 и word_2 в таблице ссылок, если хотите - я имел в виду, если у вас есть две ассоциации * с числовыми суффиксами, это обычно означает, что вы должны реорганизовать. Мой код выводит вас из двух наборов ассоциаций в один. –
has_many: синонимы не будут работать, потому что в вашей модели ссылок вы не определяете какую-либо ассоциацию: синоним. Пожалуйста, также разбейте различные модели на разные разделы кода. –