Rails Advanced Sorting - PullRequest
       22

Rails Advanced Sorting

0 голосов
/ 16 июня 2011

У меня три модели, в основном:

class Vendor
  has_many :items
end

class Item
  has_many :sale_items
  belongs_to :vendor
end

class SaleItem
  belongs_to :item
end

По сути, каждый sale_item указывает на конкретный item (но имеет соответствующее количество и цену продажи, которая может отличаться от базовой цены item, следовательно, отдельной модели), и каждый item сделано определенным vendor.

Я бы хотел отсортировать все sale_item по имени поставщика, но это означает, что нужно пройти через связанный item, потому что именно там находится ассоциация.

Моей первой попыткой было изменить SaleItem на следующее:

class SaleItem
  belongs_to :item
  has_one :vendor, :through => :item
end

Что позволяет мне искать SaleItem.first.vendor, но не позволяет мне делать что-то вроде:

SaleItem.joins(:vendor).all(:order => "vendors.name")

Есть ли простой способ выяснить эти сложные ассоциации и сортировку? Было бы особенно здорово, если бы был плагин, который мог бы позаботиться о подобных вещах. У меня есть много разных типов таблиц, к которым можно добавить сортировку в этом приложении, и я чувствую, что это будет большой кусок работы по выяснению.

Ответы [ 2 ]

0 голосов
/ 16 июня 2011

Это определенно можно сделать с более сложным SQL-запросом (возможно, с использованием find_by_sql), но вы также можете сделать это довольно легко в Ruby. Попробуйте что-то вроде следующего:

SaleItem.find(:all, :include => { :items => :vendors }).sort do |first,second|
  first.vendor.name <=> second.vendor.name
end

Я не проверял его, поэтому он может работать не совсем так, но он должен дать вам хорошее представление об одном возможном решении.

Редактировать : Найден старый пост в блоге, который, похоже, решил эту проблему Надеемся, что это все еще работает в последней версии ActiveRecord.

источник: http://matthewman.net/2007/01/04/eager-loading-objects-in-a-rails-has_many-through-association/

Второе редактирование : прямо из документации по Rails

Чтобы включить глубокую иерархию ассоциаций, используйте хеш:

for post in Post.find(:all, :include => [ :author, { :comments => { :author => :gravatar } } ])

Это захватит не только все комментарии, но и всех их авторов и граватарные картинки. Вы можете смешивать и сопоставлять символы, массивы и хэши в любой комбинации, чтобы описать ассоциации, которые вы хотите загрузить.

Вот ваше объяснение.

0 голосов
/ 16 июня 2011

Действительно ли вам нужно, чтобы ваши sale_items были отсортированы по базе данных, или вы могли бы подождать, пока он будет представлен, и выполнить сортировку на стороне клиента с помощью javascript (есть несколько отличных библиотек сортировки) - это сэкономит ресурсы процессора и сервера сложность кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...