在Rails中设置字段的默认值

时间:2015-07-23 12:35:23

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

所以我有这个模型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方法上定义它,不是吗?

2 个答案:

答案 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.

基于状态对数据库执行查询的速度也快得多,因为您要比较整数而不是字符串。