0

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

このコードが非常に非効率的であることは十分承知していますが、私のルビー チョップはまだ対応できていません...

基本的に私がしなければならないことは@related、同じようなタグを持つ 3 つの車のモデルを、繰り返されないようにランダムに設定することです。

4

3 に答える 3

2

Array#sampleは、サンプルの数、サイズを受け入れます。したがって、コードは次のように簡略化できると思います。

@tag = @car.tag_list.sample
@sametags = Car.tagged_with(@tag)
@related = (@sametags - [@car]).sample(3)
于 2013-03-15T13:56:38.333 に答える
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)
于 2013-03-15T13:54:50.943 に答える
-1

スクランブルを使用して最初に配列をシャッフルし、次に上位 3 つの項目だけを選択します。

[1,2,3,4].scramble => [3,1,2,4]
于 2013-03-15T13:56:28.840 に答える