我正在尝试为 rails 中的模型使用默认值。我见过的最好的记录方法是在迁移中使用 :default 参数。但是,看起来这仅适用于值。我正在尝试设置默认表达式,特别是 currval('customers_id_seq'::regclass). 我可以手动添加默认表达式,但我不知道如何告诉 rails 使用默认值。创建模型对象时如何使用此默认值?
编辑 这是一个更具体的例子:
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
Run Code Online (Sandbox Code Playgroud)
通过此迁移,我可以运行insert into testmodels (datafield) VALUES ('sometestdata');,这将向表中添加一行,其中idxfield默认为id。
但是,如果我Testmodel.create(:datafield=>"testdata")从 rails 控制台运行,它会替换为 nullidxfield并引发异常。
我最近在我的rails应用程序上进行了一系列测试,其中包含各种输入,我发现了传入请求中的空字符如何处理的问题.我的应用程序由Postgresql 8.4数据库支持.事实证明,Postgresql不支持在标准"text"或"varchar"字段中存储空字符.但是,当我尝试通过rails存储其中包含空字符的字符串时,默认行为似乎是在空字符后截断字符串.我认为这是一个问题,因为在截断发生之前验证了字符串.可以通过插入空字符来绕过诸如长度之类的事物的验证,因为ruby可以完美地处理它们并且截断仅发生在插入上.
我正试图找出处理这些输入的最佳方法.对我来说理想的行为就是在处理无效的UTF-8字节时抛出异常.现在,我能想到的唯一选择是显式检查每个输入字符串是否为空字符.我宁愿采用一种通用方法,但我不确定在哪里开始寻找.修补postgresql适配器来检查这是一个选项吗?还是有一些我一直缺少的标准方法?