Вопрос:

Модельные ассоциации Rails

ruby-on-rails ruby model-associations

47 просмотра

1 ответ

77 Репутация автора

У меня проблемы с концептуализацией хорошего способа создания ассоциаций между двумя разными моделями в моем приложении Rails.

На данный момент у меня есть модель Person и модель Note . Человек может быть автором или предметом заметки. Следовательно:

  • Человек может принадлежать многим примечаниям (как субъект).
  • Человек может иметь много заметок (как автор).
  • Записка принадлежит одному автору ( лицо ).
  • Нота может иметь один субъект ( человек ).

Я представляю приложение , которым нужно отобразить Person профили, в которых мы можем видеть все примечания , что лицо имеет в письменном виде , а также все примечания , написанные о с лица .

Как лучше всего создать эту модель-ассоциацию? Прямо или через модель промежуточных отношений?

Заранее спасибо!

Автор: ArcGhost Источник Размещён: 08.11.2017 10:43

Ответы (1)


1 плюс

3357 Репутация автора

Решение

На мой взгляд, самый чистый способ - сделать пометку принадлежащей автору и теме:

class Note < ActiveRecord::base
  belongs_to :author, class_name: 'Person', foreign_key: :author_id
  belongs_to :subject, class_name: 'Person', foreign_key: :subject_id
end

class Person < ActiveRecord::base
  has_many :authored_notes, class_name: 'Note', foreign_key: :author_id
  has_many :notes_about_me, class_name: 'Note', foreign_key: :subject_id
end

Возможно, вы захотите изменить названия отношений выше, но вы получите картину.

Я знаю, что мы обычно не думаем, что записка о ком-то принадлежит к предмету заметки. Однако с точки зрения Rails эти belongs_toотношения позволяют нам разместить subject_idвнешний ключ на notesстоле, что является самым простым решением. Если бы вы использовали has_oneотношения, вам пришлось бы создать таблицу соединений, которая, на мой взгляд, добавляет ненужную сложность.

Убедитесь, что в вашей notesтаблице есть две проиндексированные ссылки на personsтаблицу с именами subject_idи author_id. Вы можете сделать это с помощью миграции следующим образом:

class AddSubjectAndAuthorToNotes < ActiveRecord::Migration
  def change
    add_reference :notes, :author, index: true
    add_reference :notes, :subject, index: true

    add_foreign_key :notes, :people, column: :author_id
    add_foreign_key :notes, :people, column: :subject_id
  end
end
Автор: Tom Aranda Размещён: 08.11.2017 11:03
Вопросы из категории :
32x32