Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为MySQL/Rails中的列获取随机默认值_Mysql_Ruby On Rails - Fatal编程技术网

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

如何为MySQL/Rails中的列获取随机默认值,mysql,ruby-on-rails,Mysql,Ruby On Rails,假设我有一个mysql表,其中充满了像“#EE3AA”这样的颜色值。我有一个模型,它有一个颜色属性,这是必须的(应该验证),但不需要用户输入。如果用户将其留空,我希望使用从另一个表中自动选择的随机值填充,但默认情况下不总是相同的值 我想,也许我可以使用迁移来完成,所以它是这样的: ... :default => "values of the color column of the Colors table".to_a.sample 就Ruby而言,我的想法可能不正确/不合法。在migra

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

我想,也许我可以使用迁移来完成,所以它是这样的:

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

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

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

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()

不太清楚您在问什么。您将数据拉入迁移文件是什么意思?在我看来,最好将此逻辑移到model hook中(在保存之前),它将更易于维护和测试。对于问题的模糊性和延迟返回,我深表歉意。我编辑了问题。随机默认。。。这让我想起了这一点:+1非常好的答案,在rails和基于模型的版本中。干得好。有没有关于rspec测试使用这个的想法?@Michaeldurrent,谢谢。我想我看到一个铁路专家在谈论随机测试,但我找不到。如果我要为此编写一个测试,我只需检查当color属性保留为空时,保存后它是否不再为空。我还要测试保存后的值是否存在于颜色表中。我对测试某个值是否真的是随机值的建议很感兴趣。谢谢你的回答。我明白这一点。因此,即使我在迁移文件中有这样一行:“t.integer:cost,:default=>(5..12).to_a.sample”,它也不会影响新创建的模型,应该在before_save函数中。@barerd:是的,如果随机设置默认值,它将始终是相同的(但随机选择)值。你基本上是在尝试做阿内普链接的搞笑漫画中显示的事情。如果在模型中使用回调函数,则每个记录都会有一个新的随机值。@Misha:上面的函数工作得很好,值得鼓励,我尝试了rand()函数来获取随机数值,但失败了。尝试了stackoverflow中关于rand的每一篇文章,但无法使create_model{(:rating=>“5+rand(6)”)}获得5到10之间的值。你知道这件事吗?