0
我想为我的Rails应用程序中的模型创建一些新的订单方法。这种顺序方法应该能够比较一列中的记录。在列表的开头应该是该列最高(> 250)和最低(< 80)值的记录,其他值(平均值在80和250之间)应该在列表末尾。是否有可能在轨道中做到这一点?Rails是否可以为模型创建自定义的订单方法?
我想为我的Rails应用程序中的模型创建一些新的订单方法。这种顺序方法应该能够比较一列中的记录。在列表的开头应该是该列最高(> 250)和最低(< 80)值的记录,其他值(平均值在80和250之间)应该在列表末尾。是否有可能在轨道中做到这一点?Rails是否可以为模型创建自定义的订单方法?
随着平原红宝石
# 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')
如果发生这种情况由于性能原因数据库/ SQL中或你想一个普通的红宝石的解决方案? – slowjack2k
在SQL内部没问题,但是如果你可以给我一个提示,如何用普通的红宝石做这样的事情,那会很棒。 –