Как мои старые таблицы создания объединенных таблиц работали без индексов? - PullRequest
0 голосов
/ 09 января 2019

Я ранее создал объединенную таблицу с миграцией:

class CreateJoinTableCategoryListing < ActiveRecord::Migration[5.2]
  def change
    create_join_table :categories, :listings do |t|
      # t.index [:category_id, :listing_id]
      # t.index [:listing_id, :category_id]
    end
  end
end

Я оглядывался назад на это, так как собираюсь создавать новые таблицы соединений. Но, глядя на это, я заметил, что я мигрировал с комментариями t.index, и объединенные таблицы по-прежнему работают правильно.

Я прочитал это и не нашел ни одного сообщения о том, что кто-то делает то же самое или не нуждается в них.

Как это работает с этими индексами, которые никогда не переносились, и насколько они нужны?

Я создаю новую миграцию:

class CreateJoinTable < ActiveRecord::Migration[5.2]
  def change
    create_join_table :users, :affiliates do |t|
      # t.index [:user_id, :affiliate_id]
      # t.index [:affiliate_id, :user_id]
    end
  end
end

Какой индекс мне выбрать здесь?

Как это должно работать, партнер может вручную вносить «комиссию» в таблицу (которую необходимо добавить в миграцию), но если комиссия обновляется, она должна занять место столбца и не создавать новую строку.

Пользователь на самом деле не имеет к этому никакого отношения, и в основном он будет обновляться партнером для обновления ставок комиссионных, которые он имеет для пользователя.

Обновление:

Возможно ли добавить еще одно поле в таблицу соединений?

Я хотел добавить: комиссию к столу, но я не могу найти никаких документов, чтобы сделать что-нибудь для этого. Должен ли я просто определять размер комиссии в таблице пользователей и покончить с таблицей соединений?

ОБНОВЛЕНИЕ 2:

Заканчивал эту идею и оставляю свой текущий метод только для ассоциации пользователей и партнеров. Я покончил с идеей UsersAffiliates, так как она не нужна для этого случая.

1 Ответ

0 голосов
/ 09 января 2019

Как это работает с теми индексами, которые никогда не переносились и как нужно они?

Все типы ассоциаций в Rails будут работать без индексов. Единственное, что требуется, - это наличие правильных таблиц и столбцов.

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

Какой индекс мне выбрать здесь?

Вся причина того, что Rails генерирует два разных индекса, заключается в том, что вы должны выбрать индекс, который соответствует тому, как вы будете чаще всего искать в таблице. Если вы чаще всего используете User.joins(:affilitates), вы можете выбрать t.index [:user_id, :affiliate_id], например.

Как это работает, партнер может вручную отправить «комиссия» к столу (который нужно добавить к миграция).

Макрос create_join_table создает таблицу соединений, названную для has_and_belongs_to_many ассоциаций.

Основная проблема с has_and_belongs_to_many ассоциациями заключается в том, что они безголовы. Не существует модели и, следовательно, нет способа напрямую запросить таблицу или добавить дополнительные столбцы метаданных.

Вместо этого вы хотите has_many :through ассоциацию.

class User < ApplicationRecord
  has_many :user_affiliates
  has_many :affiliates, through: :user_affiliates
end

class Affiliate < ApplicationRecord
  has_many :user_affiliates
  has_many :affiliates, through: :user_affiliates
end

# call this whatever you want
class UserAffiliate  < ApplicationRecord
  belongs_to :user
  belongs_to :affilitate
end

Пока has_and_belongs_to_many использует схему именования таблиц users_affilities (plural_plural), которую вы хотите использовать user_affilities для has_many through: ассоциации.

Вы можете это исправить:

  1. Просто генерируем таблицу / модель с помощью обычного генератора rail g model user_affiliate.
  2. Если таблица существует написать миграцию, чтобы переименовать таблицу .

но если комиссия обновляется, она должна занять место столбца, а не создавать новую строку.

Вы можете решить эту проблему:

  1. Добавить уникальный составной индекс в два столбца t.index [:user_id, :affiliate_id], unique: true.
  2. Добавить проверку уникальности в модели соединения. validates_uniqueness_of :user_id, scope: :affiliate_id.
  3. Используйте .find_or_initialize_by в вашем контроллере для обновления существующей строки, если она существует, вместо создания новой строки, если она уже существует.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...