2014-10-29 83 views
1

我正在使用Ruby on Rails。订购后如何获得记录中的第一行? Ruby On Rails

我对模型进行了查询,但我想获取具有最高值的平均属性的一个寄存器。这是我的代码:

@dish = Dish.where("day = ? and week = ?", params[:day], params[:week]) 

@dish.order(:average) 

@sug = @dish.first 

@sug得到最低的ID,没有一个具有最高的平均记录。

我也试着这样说:

@sug = @dish.order(:average).limit(1) 

,但它不工作要么。我怎样才能得到一个注册?

回答

1

您需要按如下方式链接呼叫。

@dish.order(:average).first 

.order调用不改变@dish实例,所以当你调用@dish.first顺序不再是存在的。

+0

它的工作!我必须做的唯一改变是打电话订购(平均值::desc),因为我试图获得最高的一个。谢谢! – 2014-10-29 01:54:04

+0

我认为更清楚地说你必须实际更新'@ dish',比如'@dish = @ dish.order(:average)',而不是说你必须“链接”调用。 – meagar 2014-10-29 01:54:14

+0

@meager,我相信在这种特殊情况下,链接方法会更加清晰和简洁地显示如何完成TC要求的内容。由于这里没有更大的图片,我不能推测在更高层次上创建范围是否会有价值。你所建议的方法并不能保留更高层次的范围,只是为已经相对简单的东西添加了一行额外的代码;我没有看到这方面的附加价值。 – bigtunacan 2014-10-29 03:31:36

1

@dish.order不命令已经找到盘子,它将查询更改为包含一个订单子句。

@dish = Dish.where("day = ? and week = ?", params[:day], params[:week]).order(:average)会做你想要的东西,所以会

@dish = Dish.where("day = ? and week = ?", params[:day], params[:week]) 
@dish = @dish.order(:average) 

@sug = @dish.first 
0

ActiveRecord::QueryMethods#order方法排序中ascending order默认情况下,所以尽量明确地要求一个下降顺序,然后取第一:

Dish.order(average: :desc) 
    .where("day = ? and week = ?", params[:day], params[:week]) 
    .first 

这里假设您的average属性存储在数据库中,并且不是计算。