【问题标题】:.sample not working in seeds.sample 在种子中不起作用
【发布时间】:2016-04-03 08:40:28
【问题描述】:

变量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

有谁明白为什么要创建一个带有空白 var 的文章?

更新:使用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

【问题讨论】:

  • 我也试过var = [0, 1].sample,但这并没有什么不同。我在种子的其他位置也使用.sample,没有问题。

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


【解决方案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 上的cmets,您不应该将presence 用于boolean 值:

请注意,您无法对boolean field 的存在性 (validates :field, presence: true) 进行常规验证(该字段对于 false 值无效)。

但是在 Rails 3 和 4 中,validates :field, inclusion: [true, false] 将测试是否包含在值列表中,并具有测试字段是否存在的副作用(除非其中一个值当然是 nil)。 ——马丁·卡雷尔 7 月 14 日 19:38

...所以您应该能够使用以下内容:

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

Another good ref

【讨论】:

  • 感谢您的解释!
  • 解释是一回事,让它发挥作用是另一回事 :) 有兴趣知道它是否有效
  • 我实际上是通过删除validates :var, presence: true 行来让它工作的。事实证明,presence 不允许对布尔值进行验证。
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 2016-08-09
  • 2018-01-30
  • 2015-08-09
  • 2019-05-24
  • 2022-08-22
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多