Rails 4 STI 用户的辅助 ID
Rails 4 Secondary ID For Users With STI
在 Rails 4 个应用程序中,用户可以是 2 种不同类型,普通 或 高级,存储在 PostgreSQL,使用单Table继承,因为它们具有非常相似的属性。
当用户(普通)注册高级版时,我希望能够跟踪他的“:premium_user_id”,这基本上是一个用户 table:
中的第二个 :id 列
- 如果 :id 为 25 的用户是第一个注册高级版的用户,则他的 :premium_user_id 为 1
- 如果 :id 57 的用户是第二个注册 premium 的用户,他的 :premium_user_id 是 2
等等。
我可以在带有索引的用户 table 中添加一个 :premium_user_id 列,并在 id 喜欢的高级注册操作调用增量中所以:
current_user.update_attribute :premium_user_id, User.maximum("premium_user_id") + 1
我不太确定这个解决方案每次都需要一个数据库调用,但我想不出一个地方来存储那个 Max Premium Id 以避免数据库调用。
有没有更好的实现方法?
特别是通过迁移和 SQL 语句在数据库级别实现这一点。
感谢您的建议。
添加迁移
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
在 Rails 4 个应用程序中,用户可以是 2 种不同类型,普通 或 高级,存储在 PostgreSQL,使用单Table继承,因为它们具有非常相似的属性。
当用户(普通)注册高级版时,我希望能够跟踪他的“:premium_user_id”,这基本上是一个用户 table:
中的第二个 :id 列- 如果 :id 为 25 的用户是第一个注册高级版的用户,则他的 :premium_user_id 为 1
- 如果 :id 57 的用户是第二个注册 premium 的用户,他的 :premium_user_id 是 2
等等。
我可以在带有索引的用户 table 中添加一个 :premium_user_id 列,并在 id 喜欢的高级注册操作调用增量中所以:
current_user.update_attribute :premium_user_id, User.maximum("premium_user_id") + 1
我不太确定这个解决方案每次都需要一个数据库调用,但我想不出一个地方来存储那个 Max Premium Id 以避免数据库调用。
有没有更好的实现方法?
特别是通过迁移和 SQL 语句在数据库级别实现这一点。
感谢您的建议。
添加迁移
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