0

我正在使用 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 => " deleted_at asc ") 时,它不会像预期的那样在released_at 上排序。事实上,我是否指定根据“asc”或“desc”进行排序并不重要,我会返回相同的集合。

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

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

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

| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |

| 发布_at | 日期时间 | 是 | | 空 | |

| 更新时间 | 日期时间 | 是 | | 空 | |

4

2 回答 2

1

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

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

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

于 2012-06-04T09:44:48.387 回答
-1

有时它需要为排序字段定义一个索引才能使其工作。

于 2012-05-31T12:02:03.010 回答