所以我有这个模型Request
,这是完美的。我决定添加一个" status"字段,默认值
def change
create_table :requests do |t|
t.references :owner, index: true
t.references :pretender, index: true
t.belongs_to :book, index: true
t.string :status, value: "pending", null: false
t.timestamps null: false
end
end
但现在我在这一行得到一个COnSTRAINT NOT NULL:
...
user.requests.build owner_id: oid, pretender_id: pid, book_id: bid
...
哪个工作得很好。如果该字段具有默认值,我不需要在build
方法上定义它,不是吗?
答案 0 :(得分:3)
在迁移文件中,语法不是value
,而是default
:
t.string :status, null: false, default: 'pending',
答案 1 :(得分:1)
由于MurifoX已经回答,请使用default
选项而不是value
。
ActiveRecord有一个名为enumerables的非常好的技巧。基本上,您将状态存储为整数:
t.integer :status, null: false, default: 0, index: true
然后在模型中添加列映射到的值:
class Request < ActiveRecord::Base
enum status: [:pending, :reserved, :foo, :bar]
end
这会自动为您提供:
Request.reserved # scopes
request.pending? # interrogation methods
request.reserved! # bang methods to change the status.
基于状态对数据库执行查询的速度也快得多,因为您要比较整数而不是字符串。