.sample不在种子中工作

时间:2015-12-29 12:50:36

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

变量varboolean,不应该被允许为空。因此,在我的模型文件中,我有:

validates_inclusion_of :var, :in => [true, false]
validates :var, presence: true

在我的种子文件中,我有:

title = "abc"
var = [true, false].sample
author.articles.create!( title: title,
                         var: var)

播种会产生错误:

ActiveRecord::RecordInvalid: Validation failed: Var can't be blank

是否有人理解为什么要创建包含空白变量的文章?

更新:使用debugger,我可以确认var的值为1.

文章架构:

  create_table "articles", force: :cascade do |t|
    t.integer  "author_id"
    t.string   "title",          limit: 50,                null: false
    t.boolean  "var",                       default: true, null: false
    t.datetime "created_at",                               null: false
    t.datetime "updated_at",                               null: false
  end

1 个答案:

答案 0 :(得分:1)

  

不应该被允许为空白

更好的方法是在数据库中设置default值。

这不仅会释放Rails的处理能力,而且还会确保无论什么, 存在值,boolean的必要性:

$ rails g migration AddDefaultToBool

# db/migrate/add_default_to_bool____________.rb
class AddDefaultToBool < ActiveRecord::Migration
   def change
      change_column :articles, :var, :boolean, default: false
   end
end

$ rake db:migrate

这样,如果值不存在,您将始终将boolean设为false。我知道这不是你所要求的,但无论如何都会是一个更好的解决方案。

就验证而言,您需要使用较新的validates简写:

#app/models/article.rb
class Article < ActiveRecord::Base
   validates :var, presence: true, inclusion: [:true, :false]
end

根据对this question的评论,presence值不应为boolean

  

请注意,您无法对validates :field, presence: true的状态(boolean field)进行常规验证(该字段对于错误值无效)。

     

但是在Rails 3和4中,validates :field, inclusion: [true, false]会测试是否包含在值列表中,副作用是测试字段的存在(除非其中一个值当然为零)。 - Martin Carel 7月14日19:38

...所以能够使用以下内容:

#app/models/article.rb
class Article < ActiveRecord::Base
   validates :var, inclusion: [:true, :false]
end

Another good ref