我在Rails中有以下代码
@related = []
while @related.compact.size < 3
@tag = @car.tag_list.sample #pick a tag from the @car's tag_list
@sametags = Car.tagged_with(@tag) # get all cars with that tag
@related.push(( @sametags - Array(@car) - @related.compact).sample) #put that car in @related
@counter = @counter + 1 #increment
break if @counter == 10 #stop if its taking too long
end
我很清楚这段代码的效率非常低,但我的ruby chops还没有用呢......
基本上我需要做的就是随机填充@related
3个带有相似标签的汽车模型,这些标签不会重复。
答案 0 :(得分:2)
Array#sample接受样本的数量。所以我认为,您的代码可以简化为:
@tag = @car.tag_list.sample
@sametags = Car.tagged_with(@tag)
@related = (@sametags - [@car]).sample(3)
答案 1 :(得分:1)
您可以使用随机排序来执行此操作。
@related = Car.limit(3).order('rand()').tagged_with('blood red')
更新:没有@car
@tag = @car.tag_list.sample
@related = Car.where('id != ?', @car.id).limit(3).order('rand()').tagged_with(@tag)
更新:如果您使用的是acts_as_taggable_on
@related = Car.where('id != ?', @car.id).limit(3).order('rand()')
.tagged_with(@car.tag_list, any: true)
答案 2 :(得分:-1)
首先使用scramble对阵列进行洗牌,然后选择前三项。
[1,2,3,4].scramble => [3,1,2,4]