2011-09-20 49 views
4

我想在rails中使用模型的默认值。我所见过的最好的记录方式是在迁移中使用:default参数。但是,它看起来像只适用于值。我正在尝试设置默认表达式,具体为currval('customers_id_seq'::regclass)。我可以手动添加默认表达式,但我无法弄清楚如何告诉rails使用默认值。创建模型对象时如何使用此默认值?如何在ActiveRecord中使用默认的sql表达式?

EDIT 下面是一个更具体的例子:

class CreateTestmodels < ActiveRecord::Migration 
    def up 
    create_table :testmodels do |t| 
     t.integer :idxfield, :null=>false 
     t.string :datafield 
     t.timestamps 

    end 
    execute("ALTER TABLE testmodels ALTER COLUMN idxfield SET DEFAULT currval('testmodels_id_seq'::regclass)") 
    end 

    def down 
    drop_table :testmodels 
    end 
end 

利用这种迁移,我可以运行insert into testmodels (datafield) VALUES ('sometestdata');,这将表中增加一个行,其中idxfield默认为id

但是,如果我从rails控制台运行Testmodel.create(:datafield=>"testdata"),它会将空值替换为idxfield并引发异常。

回答

0

听起来就像你正在尝试使用Postgres序列,rails会在迁移中的所有主键定义中使用。

如果你需要将它添加到非主键列,那么你就需要在添加默认的create_table之外运行ALTER TABLE和自己添加它,就像

execute("ALTER TABLE users ADD COLUMN foo INTEGER default nextval('users_id_seq'::regclass)") 
+0

我已经成功使用执行的字段。然而,我无法弄清楚如何使轨道实际上使用默认,当我运行。创建链接到此表的模型。 – Belly

相关问题