2016-08-16 80 views
0

我想为我的Rails应用程序中的模型创建一些新的订单方法。这种顺序方法应该能够比较一列中的记录。在列表的开头应该是该列最高(> 250)和最低(< 80)值的记录,其他值(平均值在80和250之间)应该在列表末尾。是否有可能在轨道中做到这一点?Rails是否可以为模型创建自定义的订单方法?

+0

如果发生这种情况由于性能原因数据库/ SQL中或你想一个普通的红宝石的解决方案? – slowjack2k

+0

在SQL内部没问题,但是如果你可以给我一个提示,如何用普通的红宝石做这样的事情,那会很棒。 –

回答

0

随着平原红宝石

# when order between 0 - 80 and > 250 does not matter 
YourModel.all.to_a.sort_by do |record| 
    if record.order_col < 80 || record.order_col >250 
    0 
    else 
    1 
    end 
end 

# when order between 0 - 80 and > 250 does matter 
YourModel.all.to_a.sort_by do |record| 
    if record.order_col < 80 || record.order_col >250 
    record.order_col 
    else 
    record.order_col + YourModel.max(:order_col) + 1 
    end 
end 

随着SQL

# with sql 

scope :ordered, find_by_sql(%(
    SELECT your_model.* FROM your_model where value < 80 OR value > 250 ORDER BY id desc 
    UNION 
    SELECT your_model.* FROM your_model where value >= 80 and value <= 250 ORDER BY id desc 
)) 

# can work with mysql 
YourModel.select(:field, ..., 'IF (column < 80 OR column > 250, column, column + (SELECT max(column) FROM yourtable) + 1) as order_column').order('order_column desc') 
相关问题