Will_paginate可以按某些列排序,但不能按Model上的其他列排序

时间:2012-05-31 11:48:29

标签: ruby-on-rails will-paginate

我正在使用Ruby 1.8.7对Rails 2应用程序进行一些维护。我正在使用will_paginate。

我有以下问题: 当调用current_user.products.paginate(:page => 1,:order =>“ updated_at asc ”)时,它会根据预期,根据产品中的updated_at属性进行排序。

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

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

可能导致此问题以及如何纠正此问题?

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

|领域|输入|空|钥匙|默认|额外|

| released_at | datetime |是的| | NULL | |

| updated_at | datetime |是的| | NULL | |

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

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