rails от многих до многих

может ли кто-нибудь указать мне в правильном направлении:

Я пытаюсь построить модель для рельсов, которые создают следующее:

ClassA -id

ClassA имеет отношение ко многим «ClassA» (так что это ссылка на себя)

Я ищу миграцию и модель.

Я не уверен, что такое правильная таблица соединений (я думаю, что ее простая таблица с двумя столбцами ClassA_id, ClassARel_ID -> оба указывают на ClassA) и как построить модель

Благодаря!

Я бы использовал что-то вроде

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 

И таблицы будут похожи на

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

Если это не слишком важно для создания другого classа, чтобы присоединиться к ним, альтернативный подход может быть:

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

Таблица соединений будет выглядеть так:

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

У этого сообщения есть хороший рабочий пример: http://blog.hasmanythrough.com/2007/10/30/self-referential-has-many-through

Здесь также есть связанный с этим вопрос: проблема с самореференциальным has_many: через ассоциации в Rails

К сожалению, ответ Уистлера может оказаться неприемлемым во многих случаях. Например, это не работает в обоих направлениях. Например, предположим, что вы создаете новое слово:

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

Теперь, если вы это сделаете:

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

однако, если вы сделали это наоборот:

 word = Word.find_by_word_name('vibrate') p word.synonyms # this would print an empty association. 

Это говорит, что слово «вибрировать» не имеет синонимов.

Таким образом, в основном этот метод не будет работать в обоих направлениях (т. Е. Вибрация является синонимом дрожания, а дрожь – синоним вибрации)

Изменить: в некотором смысле, вы можете использовать этот подход, однако вам придется явно назначать синонимы для каждого слова. Поэтому, хотя вы указали синонимы дрожания (которые «вибрируют» и «встряхиваются»), вам придется по-прежнему указывать синонимы «дрожания» («которые дрожат» и «вибрируют») и «вибрируют» (которые ” дрожать и дрожать »).

  • rails server bin / rails: 6: предупреждение: уже инициализированная постоянная ошибка APP_PATH
  • Rails: ссылки «Next post» и «Previous post» в моем представлении, как?
  • Rails - передача параметров в link_to
  • Разница между form_for, form_tag?
  • Обезьяна патч в Rails 3
  • путают autoload_paths vs eager_load_paths в рельсах 4
  • Странная ошибка «406 неприемлема»
  • Имеется ли документация для типов столбцов Rails?
  • Доступ к current_user в модели
  • Как отображать время в часовом поясе пользователя
  • Rails активная запись запросов к ассоциации с 'существует'
  • Давайте будем гением компьютера.