【问题标题】:Trying to generate a Random String to Save to PG Table as client_number Rails 4, PGSQL尝试生成一个随机字符串以保存到 PG 表作为 client_number Rails 4,PGSQL
【发布时间】:2016-05-10 13:52:02
【问题描述】:

当管理员在我们的 Rails 4 应用程序中生成新客户端时,我正在尝试自动生成“客户端编号”。

我已经阅读了几篇关于此的文章,但大多数都在谈论易碎令牌。

到目前为止,我的客户端模型只有一个 client_number 属性,它是一个字符串。

我的模型看起来像:

class Client < ActiveRecord::Base

  before_save generate_client_number

  validates_uniqueness_of :client_number

  def generate_client_number
    self.client_number = SecureRandom.hex(2).upcase
  end

end

我们使用 PostgreSQL 作为我们的数据库,我对 Rails 比较陌生。将上述内容添加到我们的模型后,它会在控制台中出错,这是它抛出的错误:

NameError: undefined local variable or method `generate_client_number' for #<Class:0x007fc59bdd7008>
Did you mean?  generated_attribute_methods

我有点不知所措。任何帮助将不胜感激,我相信这是我的疏忽。提前致谢。

编辑#1:

已通过修复代码错误消除了该错误。并添加

before_save :generate_client_number

但是,当我尝试创建随机字符串并保存到数据库时,我现在得到:

irb(main):013:0> Client.create
   (0.1ms)  BEGIN
  Client Exists (0.2ms)  SELECT  1 AS one FROM "clients" WHERE "clients"."client_number" IS NULL LIMIT 1
   (0.1ms)  ROLLBACK
=> #<Client id: nil, client_number: nil, created_at: nil, updated_at: nil> 

【问题讨论】:

    标签: ruby postgresql ruby-on-rails-4


    【解决方案1】:

    只是正确使用符号的问题:

    before_save :generate_client_number
    

    这些 after_* 和 before_* 钩子是由一个带有被调用方法名称的符号定义的,所以你需要用 : 编写 :generate_client_number,而不是只需生成_client_number。

    关于它没有生成数字的事实,您的错误消息意味着您正在获得重复并有一个回滚。建议你试试

    self.client_number = SecureRandom.uuid.upcase
    

    【讨论】:

    • 这消除了错误问题但是dosnt创建或保存数字到记录中?我在这里错过了什么吗? -- 仍然是最佳答案,因为它可以消除错误
    【解决方案2】:

    我会在这里添加我自己的答案,并且我已经解决了这个问题,

    看来,我第一次尝试创建客户端时,它保存了一条包含 nil ID 的记录,我不知道如何或为什么不知道.. 但是,清除客户端记录并从头开始解决了我的问题。感谢您的输入。

    【讨论】:

    • 你有没有试过在爆出记录后创建多条记录,只是为了检查你是否没有得到更多的回滚?
    • 我刚刚成功创建了 55 个客户端,没有冲突或回滚
    • 太棒了!恭喜。
    • 这是人生的目标之一,我的朋友。每天至少学到一件事。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2013-10-01
    • 2017-04-05
    • 2017-08-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多