如何获取MySQL / Rails中列的随机默认值

时间:2011-11-24 14:00:31

标签: mysql ruby-on-rails

假设我有一个充满颜色值的mysql表,如“#EE3AA”。我有一个具有颜色属性的模型,这是必须的(应该验证),但不一定需要由用户输入。如果用户留空,我希望使用从另一个表中自动选择的随机值来填充它,但默认情况下并不总是相同的值。

我想,也许,我可以使用迁移来实现它,所以就像这样:

... :default => "values of the color column of the Colors table".to_a.sample

就Ruby而言,我的想法可能不正确/合法。在迁移文件中看到:default选项后,我认为每次创建模型时都会运行迁移文件。但阅读米哈伊尔的评论,情况可能并非如此。但无论如何,当用户没有提供任何表时,如何从另一个表中获取随机值?

1 个答案:

答案 0 :(得分:2)

迁移仅在您创建数据库或更改数据库结构时运行,而不是在保存新记录时运行。米哈伊尔建议before_save回调是正确的。您可以在模型中执行以下操作:

class Model < ActiveRecord::Base
  before_save :set_empty_color_to_random_value

  def set_empty_color_to_random_value
    self.color = Color.order("RANDOM()").first.color if self.color.empty?
  end
end

请注意RANDOM()适用于PostgreSQL和SQLite,但不适用于MySQL。对于MySQL,您必须改为使用RAND()