2016-07-08 61 views
0

由於場地有一個字段「featured_level」,可以從0到N.排序屬性和隨機復發

我需要返回由featured_level,下令但具有相同的隨機場館的秩序場館featured_level

UPDATE:

使用給出答案,我有這樣的方法:

def self.by_featured_level 
    all.group_by {|v| v.featured_level}.inject([]) { |memo, (level,values)| 
    memo << { level => values.shuffle } 
    }.map { |hash| hash.values }.flatten.reverse 
end 

但它沒有下面的測試(也沒有實數的正常工作),我還在努力算起來,使用的測試:

describe "by featured level" do 
    before do 

    @venue1 = create(:venue, featured_level: 5) 
    @venue2 = create(:venue, featured_level: 2) 
    @venue3 = create(:venue, featured_level: 4) 
    @venue4 = create(:venue, featured_level: 2) 
    @venue5 = create(:venue, featured_level: 0) 
    @venue6 = create(:venue, featured_level: 2) 
    @venues = Venue.by_featured_level 

    end 

    it { 
    start_with_hightest = @venues.index(@venue1) == 0 
    expect(start_with_hightest).to be_truthy 
    } 
    it { 
    second_hightest_is_2nd = @venues.index(@venue3) == 1 
    expect(second_hightest_is_2nd).to be_truthy 
    } 
    it { 
    ends_with_lowest = @venues.last.id == @venue5.id 
    expect(ends_with_lowest).to be_truthy 
    } 
end 

回答

0

我原本需要一個ActiveRecord ::關係,而不是一個數組(這是由@ zezetic的回答回報,所以最後我做:

scope :by_featured_level, -> { 
     select("venues.*, (random() * 9 + 1) AS rdn").order('featured_level DESC, rdn') } 
1

讓我們開始收集場館:

require 'ostruct' 

@venue1 = OpenStruct.new(id: :a, level: 0) 
@venue2 = OpenStruct.new(id: :b, level: 2) 
@venue3 = OpenStruct.new(id: :c, level: 2) 
@venue4 = OpenStruct.new(id: :d, level: 2) 
@venue5 = OpenStruct.new(id: :e, level: 4) 
@venue6 = OpenStruct.new(id: :f, level: 5) 

@venues = [@venue1, @venue2, @venue3, @venue4, @venue5, @venue6] 

我們希望每級隨機化,所以我們將創建組:

@venues.group_by { |v| v.level } 

這將返回一個散列結果,其中場地由每個級別索引。

我們遍歷散列,並返回一個新的哈希其中的值已經隨機:

@venues. 
    group_by {|v| v.level}. 
    inject([]) { |memo, (level,values)| 
    memo << { level => values.shuffle } 
    } 

該散列現在可以變平,因此最終的結果是散列的名單,每級隨機:

@venues. 
    group_by {|v| v.level}. 
    inject([]) { |memo, (level,values)| 
    memo << { level => values.shuffle } 
    }. 
    map { |hash| hash.values }. 
    flatten 
+0

我得到這個錯誤: TypeError:沒有將符號隱式轉換爲整數 完整測試: http://pastebin.com/XgW3RnjM – fabriciofreitag

+0

是的,提出了一些錯誤。嘗試修訂版本。 – zetetic

+0

仍然無法正常工作,我更新了實施和測試的代碼。 – fabriciofreitag