Rails 4 STI 用户的辅助 ID

Rails 4 Secondary ID For Users With STI

在 Rails 4 个应用程序中,用户可以是 2 种不同类型,普通高级,存储在 PostgreSQL,使用单Table继承,因为它们具有非常相似的属性。

当用户(普通)注册高级版时,我希望能够跟踪他的“:premium_user_id”,这基本上是一个用户 table:

中的第二个 :id

等等。

我可以在带有索引的用户 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