如何在Activerecord Migration中创建随机默认值

时间:2011-11-23 09:01:44

标签: ruby-on-rails activerecord

我想创建一些具有随机属性的模型,尽管在某些限制内。在迁移中执行此操作的正确方法是什么?对于小于1000的数字,是否存在比整数更适合的类型?我在考虑如下:

class X < ActiveRecord::Migration
  def up
    add_column :things, :integer, :default => "a number between 5 and 12"
  end

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

class X < ActiveRecord::Migration
  def up
    add_column :things, :integer, :default => (5..12).to_a.sample
  end
end

答案 1 :(得分:0)

这个问题并没有真正说明每一行是否应该有一个独立的值。这个答案假设“是的,每一行都应该有独立的随机值”。

要实现这一点,随机值必须由数据库生成,而不是由 Rails/ruby 生成。可以使用数据库功能来实现。

以下适用于 Postgreql 上的 Rails 5.2。我没有检查其他东西所以YMMV。

Rails 5.2 接受数据库函数作为 default 如果提供了 proc:

class AddFooInBars < ActiveRecord::Migration[5.2]
  def up
    add_column(:bars, :foo, :int,
      default: -> { "floor(random() * 1000 + 1)::int" }
    )