我想要一个带有普通主键的“ Customer”模型,另一列用于存储自定义的“客户编号”。另外,我希望数据库处理默认的客户编号。我认为,定义顺序是实现此目的的最佳方法。我使用PostgreSQL。看一下我的迁移:

class CreateAccountsCustomers < ActiveRecord::Migration
  def up

    say "Creating sequenze for customer number starting at 1002"
    execute 'CREATE SEQUENCE customer_no_seq START 1002;'

    create_table :accounts_customers do |t|
      t.string :type
      t.integer :customer_no, :unique => true
      t.integer :salutation, :limit => 1
      t.string :cp_name_1
      t.string :cp_name_2
      t.string :cp_name_3
      t.string :cp_name_4
      t.string :name_first, :limit => 55
      t.string :name_last, :limit => 55
      t.timestamps
    end

    say "Adding NEXTVAL('customer_no_seq') to column cust_id"
    execute "ALTER TABLE accounts_customers ALTER COLUMN customer_no SET DEFAULT NEXTVAL('customer_no_seq');"

  end

  def down
    drop_table :accounts_customers
    execute 'DROP SEQUENCE IF EXISTS customer_no_seq;'
  end

end


如果您知道一种更好的“类似轨道”的添加序列的方法,那就告诉我真棒。

现在,如果我做类似的事情

cust = Accounts::Customer.new
cust.save


字段customer_no未预填充序列的下一个值(应为1002)。

您知道整合序列的好方法吗?还是有一个好的插件?
欢呼所有答案!

最佳答案

我没有建议使用更多“轨道方式”来处理自定义序列,但是我可以告诉您,为什么在保存后似乎没有填充customer_no字段。

当ActiveRecord保存新记录时,SQL语句将仅返回新记录的ID,而不是其所有字段,您可以在中的当前rails源中看到此情况。

为了查看该值,您将需要重新加载该对象...

cust = Accounts::Customer.new
cust.save
cust.reload


如果您一直想这样做,请考虑在模型类中添加一个after_create钩子...

class Accounts::Customer < ActiveRecord::Base
  after_create :reload
end

关于ruby-on-rails - 如何将序列添加到迁移中并在模型中使用它们?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7606994/

10-12 04:00
查看更多