Что делает active record на стороне sql в полиморфной ассоциации?

Я понимаю, что происходит на уровне ruby, но когда модель представлена в виде внешнего ключа на своей собственной таблице, как в «комментарий может иметь много комментариев», создаются ли новые таблицы sql для представления этих комментариев под капотом? Я извиняюсь, если мой вопрос неясен. Любые и все ответы очень ценятся.

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :content, {null: false}
      t.integer :commentable_id, {null: false}
      t.string :commentable_type, {null: false}
      t.references :commenter, null: false

      t.timestamps(null: false)
    end
  end
end

2 ответа

  1. Активная запись использует commentable_typeстолбец к constantizeнему и найти связанную запись по commentable_id:

    т. е.

    commentable_type = "Post" # for example
    commentable_type.constantize # returns the Post class model
    commentable_type.constantize.find commentable_id # find the Post record
    
    # the above line is equivalent to:
    Post.find commentable_id
    
  2. Во-первых, в миграции вы можете использовать polymorphic: true для создания полиморфных ссылок:

    class CreateComments < ActiveRecord::Migration
      def change
        create_table :comments do |t|
          t.string :content, {null: false}
          t.references :commentable, polymorphic: true, index: true
          t.references :commenter, null: false
    
          t.timestamps(null: false)
        end
      end
    end
    

    Как вы уже определили, это будет просто генерировать :commentable_idи :commentable_typeстолбцы в вашей таблице комментариев, которые представляют полиморфную ассоциацию — никаких специальных таблиц или другой магии.

    commentable_typeСтолбец — это просто строка, в которой хранится имя модели, в которой находится строка belongs_to. Естественноcommentable_id, это целое число, которое содержит экземпляр idмодели, связанный с этой полиморфной ассоциацией.

    Однако, если вы действительно хотите узнать, что происходит под капотом, просто подключите к своей базе данных и посмотрите, что у вас есть.

    Некоторые полезные команды для начала работы (при условии, что вы подключились к базе данных с помощью psql) :

    \dt (эквивалентно показать таблицы)

    \d+ tablename (эквивалентно DESC tablename — где tablename-имя таблицы, на которой требуется информация)