【问题标题】:Using .sample with order specified使用 .sample 并指定顺序
【发布时间】:2014-11-27 14:50:42
【问题描述】:

我设置了一个非常简单的种子文件来填充模型

year_group_array = ['Reception', 'Year 1', 'Year 2', 'Year 3', 'Year 4', 'Year 5', 'Year 6']

6.times { 
  year_group = YearGroup.create({
    name: year_group_array.sample
  })
}

这将确保数组中的所有项目都被填充但不以任何顺序填充(理想情况下,我希望条目按照它们在数组中出现的顺序)并且我正在硬编码循环的次数要运行,我怎样才能使它更加动态,以便在数组中没有更多项目时停止?

我只是想让它的性能更好一点,这样如果我将来向数组中添加任何东西,我就不必计算数组中的项目数并设置迭代值。

【问题讨论】:

  • 为什么不试试:year_group_array[0..5].each { |sample| YearGroup.create(name: sample) }?
  • 你说得对,我想把它复杂化,愚蠢的问题要问
  • 如果我错了,请纠正我,但仅索引一个范围不会对数组进行采样。 Sample 从数组中获取一个随机元素。 ruby-doc.org/core-2.1.5/Array.html#method-i-5B-5D
  • 你是对的,josh,sample 确实从数组中获取了一个随机元素,但我的理解是,当与 6.times 结合使用时,每个随机元素都是唯一的,确保我的每个记录在我的数组将被插入到我的模型中

标签: ruby-on-rails ruby arrays ruby-on-rails-4


【解决方案1】:

将原始数组值绑定到输出的一种方法是仅枚举原始数组。

year_group_array = ['Reception', 'Year 1', 'Year 2', 'Year 3', 'Year 4', 'Year 5', 'Year 6']

year_group_array[0..5].each { |sample| YearGroup.create(name: sample) }

如果你必须使用随机值:

LIMIT = 6
source = year_group_array[0..LIMIT].dup
year_group_array[0..LIMIT].each { |sample| YearGroup.create(name: source.delete(rand(LIMIT))) }

【讨论】:

    【解决方案2】:

    我相信这应该是答案。我的一个非常简单的方法。

    year_group_array = ['Reception', 'Year 1', 'Year 2', 'Year 3', 'Year 4', 'Year 5', 'Year 6']
    
    year_group_array.shuffle.each do |year|  
      year_group = YearGroup.create({
        name: year
      })
    end
    

    所以 Array#shuffle 可以解决问题。它将随机化集合中对象的索引/位置,Collection#each 将继续将它们收集到一个块中并无序创建记录并继续添加记录,除非所有记录都已创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-16
      • 2019-08-11
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多