【问题标题】:Writing a simple incrementing counter in rails在rails中编写一个简单的递增计数器
【发布时间】:2011-03-03 15:15:12
【问题描述】:

对于每张卡片,我想为它们附加一个以 1 递增的特殊数字。

我假设我可以在控制器中完成这一切。

def create
 @card = Card.new(params[:card])
 @card.SpecNum = @card.SpecNum ++
...
end

或者。我可以公然迟钝。也许最好的选择是向 mysql 添加一个自动增量表。问题是数字必须从特定数字 1020 开始。

有什么想法吗?

【问题讨论】:

  • Ruby 没有 ++ 运算符(或者 --,不足为奇!)
  • @John 你为什么说“不出所料”?
  • 因为 ++ 没有 -- 会很奇怪,不是吗?

标签: mysql ruby-on-rails auto-increment increment


【解决方案1】:

就我个人而言,我不会把这个责任交给数据库或控制器;我喜欢它的模型。比如:

/app/models/card

validates_uniqueness_of :special_number

def before_validation_on_create
  self.special_number = CardSpecialNumber.next!
end

/app/models/card_special_number

def self.next!
  last_number_holder = CardSpecialNumber.first
  if last_number_holder.nil?
    CardSpecialNumber.create!(:counter => 1020)
    return 1020
  end

  last_number_holder.counter = last_number_holder.counter + 1
  last_number_holder.save!
  last_number_holder.counter
end

【讨论】:

  • 如果它只是一个需要递增的数字,我会使用序列或自动递增将其放入数据库。数据库可以比你更有效地做到这一点。我可以想象您需要更多控制的情况,例如顺序很重要,不允许有孔,或者一些奇怪的计数算法(例如,我必须创建一个数字 yyyy-mm-xxxx,其中 xxxx 是该月的计数......那么模型确实是最好的地方。顺便说一句如果没有可用的初始行,上述代码将始终返回 1020。
  • @nathanvda:关于 1020:你是对的,如果没有初始行,它将返回 1020,但 Trip 要求将其作为特定要求。表面上,我认为这个要求(从 1020 开始)是我绕过数据库的决定因素。我喜欢适用于不同数据库的代码; postgres / sqlite3 / sqlsever 都有不同的递增方式。多数据库命令可能是魔鬼的工作。
  • 我只有一个卡片模型。 None 仅用于特殊编号。是否必须将它们分开并使Card_Special_Number继承自Card?
  • 我认为这将是必要的,因为这将是您柜台的存储空间。这将是一张只有一条记录的表(列将是一个名为计数器的整数)虽然没有继承,但它们是两个独立的实体。
  • 几乎可以正常工作。我有一个递增的数字等等。但奇怪的是,我希望它返回这个数字“294670251400”。我将那个数字替换为 1020。但它返回为“2147483647”。很奇怪吧?奇怪的是,这个数字也停止了增加。
【解决方案2】:

您可以使用ALTER TABLE statement 为每个表设置(和重置)MySQL 的 AUTO_INCREMENT 值:

ALTER TABLE mytable AUTO_INCREMENT = 1020

ALTER TABLE 不是您希望所有用户都拥有的权限,请参阅有关适当保护它的信息。

【讨论】:

  • 嗯.. 我不想更改表格。我想更改列。我试过了, ALTER COLUMN SpecNum AUTO_INCREMENT = 1020 。它返回 SQL 语法错误
  • @Trip: MySQL 只允许每张表有一个 auto_increment 列;根据我提供的文档链接,您只能使用 ALTER TABLE 设置 AUTO_INCREMENT 的值。
  • 啊,因为另一个 auto_incrememnter 用于其他重要的事情。我想我毕竟应该使用模型。
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多