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

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

我想,也许,我可以使用迁移来做到这一点,所以它是这样的:

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

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

迁移仅在您创建数据库或更改数据库结构时运行,而不是在保存新记录时运行。 Mikhail在建议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()