在外键范围内的列中插入序列值 - Rails和Postgres

Roh*_*hit 3 sql postgresql schema ruby-on-rails

我想在我的表中有一个列,其中auto_increements在一个外键的范围内.

   id   |   foreign_key_column   |   this_column_i_want
--------------------------------------------------------
   1    |         1              |           1
   2    |         1              |           2   
   3    |         1              |           3
   4    |         2              |           1
   5    |         2              |           2
   6    |         3              |           1
Run Code Online (Sandbox Code Playgroud)

通过rails迁移可以实现这种模式吗?

请考虑以下场景:此表表示Orders表.如果此表存储来自多个商店的订单,则外键列将为store_id.现在,不同的商店需要他们的发票在他们的范围内顺序.早期的发票是全球性的.

因此,每个商店的发票编号必须从1开始,并根据为该特定商店创建的记录继续增加.

希望这有助于解释这个问题.

fon*_*999 6

有一种称为测序的宝石.我认为它会解决你的问题.

Sequenced是一个简单的gem,可为ActiveRecord模型生成范围的顺序ID.这个gem提供了一个acts_as_sequenced宏,它自动为每个记录分配一个唯一的顺序ID.顺序ID不是数据库主键的替代,而是添加另一种方法来检索对象而不暴露主键.


gem提供了Ruby/Rails实现.它使用ActiveModel :: Callbacks来设置sequential_id列的值:before_save :set_sequential_ids [link].

def acts_as_sequenced(options = {})
  # ...
  include Sequenced::ActsAsSequenced::InstanceMethods

  mattr_accessor :sequenced_options, instance_accessor: false

  self.sequenced_options = []

  before_save :set_sequential_ids
  # ...
end
Run Code Online (Sandbox Code Playgroud)

这是setter方法[link]:

def set
  return if id_set? || skip?
  lock_table
  record.send(:"#{column}=", next_id)
end
Run Code Online (Sandbox Code Playgroud)