Rails 4 Secondary ID для пользователей с STI

В приложении Rails 4 пользователи могут быть двух разных типов, обычные или премиальные, хранящиеся в PostgreSQL с использованием наследования отдельных таблиц, поскольку они имеют очень похожие атрибуты.

Когда пользователь (обычный) подписывается на премиум, я хотел бы иметь возможность отслеживать его ":premium_user_id", который в основном будет вторым столбцом :id в пользовательской таблице:

  • Если пользователь с:id 25 является первым пользователем, подписавшимся на премиум, его:premium_user_id равен 1
  • Если пользователь с:id 57 является вторым пользователем, зарегистрировавшимся в Premium, его:premium_user_id равен 2

и так далее.

Я мог бы добавить столбец :premium_user_id в таблицу User с индексом, а в приращении вызова действия подписаться на премиум с таким идентификатором вот так:

current_user.update_attribute :premium_user_id, User.maximum("premium_user_id") + 1

Я не уверен в том, что для этого решения каждый раз требуется вызов БД, но я не могу придумать, где хранить этот Max Premium Id, чтобы избежать вызова db.

Любая идея для лучшего способа реализовать это?

В частности, путем реализации этого на уровне базы данных с помощью миграций и операторов SQL.

Спасибо вам за ваши предложения.

1 ответ

Решение

Добавить миграцию

def up
  add_column :users, :premium_user_id, :integer
  execute <<-SQL
    CREATE SEQUENCE premium_user_id_seq START 1;
    ALTER SEQUENCE premium_user_id_seq OWNED BY users.premium_user_id;
    ALTER TABLE users ALTER COLUMN premium_user_id SET DEFAULT nextval('premium_user_id_seq');
  SQL
end


def down
  remove_column :users, :premium_user_id
  execute <<-SQL
    DROP SEQUENCE premium_user_id_seq;
  SQL
end

Добавить обратный звонок

class User < ActiveRecord::Base
  after_commit do
    unless read_attribute(:type) == 'premium'
      update_column :premium_user_id, nil
    end
  end
end
Другие вопросы по тегам