2016-07-08 59 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