【问题标题】:Rails: Validation fails for ActiveRecord in setting a random Boolean AttributeRails:ActiveRecord 在设置随机布尔属性时验证失败
【发布时间】:2016-03-13 04:59:37
【问题描述】:

我正在尝试通过播种将布尔值保存在模型中

20151130014042_create_duty_statuses.rb

class CreateDutyStatuses < ActiveRecord::Migration
  def change
    create_table :duty_statuses, :id => false  do |t|
      t.string :id, limit: 36, primary: true, null: false
      t.string :remark, :limit => 256
      t.boolean :active, :required => true, default: false
      t.string :employee_id,limit: 36, :required => true
      t.timestamps null: false
    end
  end
end

duty_status.rb

class DutyStatus < ActiveRecord::Base
  include UUIDHelper
  belongs_to :employee
  validates_length_of :remark , maximum: 256, message: "description must be less than 256 characters"
  validates_presence_of :active
end

seeds.rb

 dutyStatus = DutyStatus.new(remark: Faker::Lorem.sentence, employee: myEmployee)
 dutyStatus.active = [false,true].sample
 dutyStatus.created_at = rand(720..72000).hours.ago
 dutyStatus.save

如果我使用

dutyStatus.active = [false,true].sample

这不会在数据库中记录任何内容。 0,1 或“真”、“假”也不行;除非我确实喜欢隐含的 true,否则它会保存值 1;但我需要随机布尔值。这是错误:

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

如何在模型中保存随机值?

【问题讨论】:

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


    【解决方案1】:

    Andrey Deineko's answer 非常有帮助。只是为了添加它。

    我有一个 boolean 字段,我试图在我的 Rails 6 应用程序中使用

    进行验证
    validates :affiliate_status, presence: true
    

    但它失败了。我收到了错误:

    {
        "affiliate_status": [
            "can't be blank"
        ]
    }
    

    我是这样解决的

    我不得不从以下位置更改验证:

    validates :affiliate_status, presence: true
    

    到:

    validates :affiliate_status, inclusion: { in: [true, false] }
    

    就是这样。

    我希望这会有所帮助

    【讨论】:

      【解决方案2】:

      如果将 active 设置为 lambda 对象,然后在设置值时调用它会怎样?

      试试这个:

      active = -> { [false,true].sample }
      dutyStatus = DutyStatus.new(remark: Faker::Lorem.sentence, employee: myEmployee)
      dutyStatus.active = active.call
      dutyStatus.created_at = rand(720..72000).hours.ago
      dutyStatus.save
      

      我认为这也与验证布尔字段的存在有关。我认为您应该验证包含active

      validates :active, inclusion: { in: [true, false] }
      

      【讨论】:

      • 不,仍然得到 ActiveRecord::RecordInvalid:验证失败:Active 不能为空
      • @James,好的,我认为您应该验证是否包含 active (感觉就像我前段时间在布尔字段中遇到了类似的问题)。 validates :active, inclusion: { in: [true, false] }。试试看
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2023-03-13
      相关资源
      最近更新 更多