2012-05-31 4 views
0

Я выполняю некоторое обслуживание в приложении Rails 2 с использованием Ruby 1.8.7. Я использую will_paginate.Будет ли Paginate заказывать по определенным столбцам, но не по другим столбцам на модели

У меня есть следующая проблема: При вызове current_user.products.paginate (: страница => 1,: заказ => "updated_at возрастанию") упорядочивает, как и ожидалось, на основании свойства updated_at в продуктах.

Однако при вызове current_user.products.paginate (: page => 1,: order => "released_at asc") он не заказывает на release_at, как ожидалось. На самом деле не имеет значения, укажу ли я, чтобы упорядочение выполнялось в соответствии с «asc» или «desc», я получаю ту же самую коллекцию.

updated_at и released_at - оба атрибута, определенные в модели и существующие в базе данных, и все значения не равны нулю. На моделях не определено default_scope.

Что может быть причиной этого и как исправить это?

Добавление продуктов DESc ниже (для краткости я только перечисления соответствующих полей):

| Поле | Тип | Null | Ключ | По умолчанию | Экстра |

| released_at | datetime | ДА | | NULL | |

| updated_at | datetime | ДА | | NULL | |

+0

Было бы неплохо увидеть sql-запрос из журнала. –

+0

SQL-запрос из нерабочего оператора paginate в журнале: SELECT * FROM 'products' WHERE (' products'.partner_id = 171) ORDER BY released_at desc LIMIT 0, 50 и SQL-запрос из рабочей таблицы statemnet в журнале: SELECT * FROM ' продукты 'WHERE (' products'.partner_id = 171) ORDER BY updated_at desc LIMIT 0, 50. – Stanley

+0

Вы также можете использовать продукты DESC из mysql, чтобы мы могли видеть типы данных? – Ivan

ответ

1

Модель продукта наследуется от модели, которая также определяет атрибут released_at. Метод release_at перегружен в коде Ruby on Rails, так что если вызвать продукт product.released_at в экземпляре продукта Product, он фактически вызовет значение release_ата родительской модели. В результате из консоли rails всегда выглядит так, как если release_от не имеет значения null и содержит значение.

Однако, глядя на базу данных, прямо показывает, что released_at имеет значение null в модели продукта и, как таковой, даже если запрос will_paginate проходит правильно, упорядочение не выполняется, потому что значения являются одинаковыми (null). В случае, когда тот же самый запрос выполняется по атрибуту updated_at, сортировка работает, потому что этот атрибут не является нулевым. Я пропустил это, потому что я проверил пустые значения из Rails Console, а не непосредственно в MySQL.

Моим решением было определить named_scope в модели продукта, которая сортирует на основе значения в родительской модели. Затем я вызываю функцию paginate в названной области.

-1

Иногда для его работы необходимо иметь указатель, определяющий порядок полей.

+0

Что это значит? Просьба уточнить. – Stanley

+0

Я имею в виду индексы DataBase для столбцов. – ABrukish

+0

Когда я вызываю SQL-команду непосредственно в MySQL, он правильно заказывает. Поэтому я не думаю, что это проблема. – Stanley

Смежные вопросы