假设我有一个充满颜色值的mysql表,如“#EE3AA”。我有一个具有颜色属性的模型,这是必须的(应该验证),但不一定需要由用户输入。如果用户留空,我希望使用从另一个表中自动选择的随机值来填充它,但默认情况下并不总是相同的值。
我想,也许,我可以使用迁移来实现它,所以就像这样:
... :default => "values of the color column of the Colors table".to_a.sample
就Ruby而言,我的想法可能不正确/合法。在迁移文件中看到:default选项后,我认为每次创建模型时都会运行迁移文件。但阅读米哈伊尔的评论,情况可能并非如此。但无论如何,当用户没有提供任何表时,如何从另一个表中获取随机值?
答案 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()
。