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