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开始,并根据为该特定商店创建的记录继续增加.
希望这有助于解释这个问题.
有一种称为测序的宝石.我认为它会解决你的问题.
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)