2012-05-31 23 views
0

上的其他列进行排序我正在使用Ruby 1.8.7对Rails 2应用程序进行一些维护。我正在使用will_paginate。请问Paginate可以通过某些列进行排序,但不能通过Model

我有以下问题: 致电时current_user.products.paginate(:页面=> 1:为了=> “的updated_at ASC”)它的订单,如预期的基础上,在产品的updated_at属性。

但是,当调用current_user.products.paginate(:page => 1,:order =>“released_at asc”)时,它不会按照预期对released_at进行排序。事实上,无论我是按照“asc”还是“desc”指定排序,我都会返回相同的集合。

updated_at和released_at都是在模型上定义的并存在于数据库中的属性,并且所有值都是非空的。在模型上没有定义default_scope。

什么可能导致这种情况,以及如何纠正?

下面的添加产品说明(为简便起见,我只列出了相关的字段):

|字段|类型|空| Key |默认|额外|

| released_at | datetime |是| | NULL | |

| updated_at | datetime |是| | NULL | |

+0

很高兴看到来自日志的sql查询。 –

+0

从日志中的非工作分页语句开始的SQL查询:SELECT * FROM'products' WHERE('products'.partner_id = 171)ORDER BY released_at desc LIMIT 0,50以及日志中工作分页状态SQL的SQL查询:SELECT * FROM'产品'WHERE('products'.partner_id = 171)ORDER BY updated_at desc LIMIT 0,50。 – Stanley

+0

你还可以从mysql的DESC产品中查看数据类型吗? – Ivan

回答

1

产品模型继承自也定义released_at属性的模型。用于released_at的方法在Ruby on Rails代码中被重载,因此如果在Product的一个实例产品上调用product.released_at,那么它实际上会调用父模型的released_at值。因此,从rails控制台看来,released_at不是null并且包含一个值。

但是,直接查看数据库显示,产品模型中的released_at为空,因此即使will_paginate请求正确执行,也不会执行排序,因为值完全相同(空)。在对updated_at属性执行完全相同的查询的情况下,排序可以工作,因为该属性不为空。我错过了这个,因为我从Rails控制台检查了空值,而不是直接在MySQL中检查。

我的解决方案是在产品模型上定义一个named_scope,该模型根据父模型中的值进行排序。然后我调用指定范围的paginate函数。

-1

有时需要为订购字段定义索引才能使其工作。

+0

这是什么意思?请澄清。 – Stanley

+0

我的意思是列的数据库索引。 – ABrukish

+0

当我直接在MySQL中调用SQL命令时,它正确地命令。所以我不认为这是这个问题。 – Stanley

相关问题