如何将序列添加到迁移中并在模型中使用它们?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我想要一个“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

如果知道一个更好的“Rails”方法来添加序列,那么让我知道是很棒的。

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

cust = Accounts::Customer.new
cust.save

customer_no没有预先填充序列的下一个值

你知道一种很好的整合序列的方法吗?还是有一个好的插件?

提问于
用户回答回答于

我对如何处理定制序列没有任何建议,但我可以告诉您为什么是客户。_在保存后,似乎没有字段未被填充。

当ActiveRecord保存一个新记录时,SQL语句将只返回新记录的ID,而不是它的所有字段,您可以在这里看到当前Rails源中发生的情况。

为了查看重新加载对象所需的值...

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

如果总是想要这样做,请考虑在后面添加一个_创建你的模型类的钩子..。

class Accounts::Customer < ActiveRecord::Base
  after_create :reload
end
用户回答回答于

我试着在我的应用程序上实现这一点(完全相同的env:ror+PostgreSQL),并且我发现save在ROR上发出,对象具有空属性,它尝试在数据库上执行INSERT,指出所有值都将设置为NULL。问题在于PostgreSQL处理NULL的方式:在本例中,将创建新行,但所有值都为空,即默认值将被忽略。如果save只写在ROR上填充的INSERT语句属性上,这样会很好。

换句话说,它只关注于typecustomer_no属性,这就是PostgreSQL的行为方式:

情况1:

INSERT INTO accounts_customers (type, customer_no) VALUES (NULL, NULL);

(铁路就是这样save(工程)

结果:一个空的新行type空荡荡的customer_no

情况2:

INSERT INTO accounts_customers (type) VALUES (NULL);

结果:一个空的新行typecustomer_no充满了序列的NEXTVAL

扫码关注云+社区