Как отсортировать по связанной модели в пределах заданного значения? - PullRequest
4 голосов
/ 30 июня 2011

У меня есть модель Item и модель Stats.

 Item
   has_many :stats

 Stat
   belongs_to :items

В модели (например, таблица mysql) Stat есть 3 поля: rating skin_id item_id

Так что для Stat это может быть, например:

@item.stats => Array of stats for records with item_id = 1, with a differer skin_id

Мне нужно отсортировать все элементы для заданного skin_id по «рейтингу».

Что-то вроде:

@items = Item.all.order('stats[currtnt_skin.id] DESC') (of course it doesn't work)

Другими словами, янужно отсортировать в массиве:

@stats = @items.stats[current_skin.id]
@items.order (... by @stats ...)

Как это можно сделать?

Ответы [ 4 ]

5 голосов
/ 30 июня 2011

Во-первых, я предполагаю, что belongs_to :items вы имеете в виду belongs_to :item (единственное число), учитывая наличие внешнего ключа item_id.

Во-вторых, для решения вашего конкретного запроса вы можете использовать:

Stat.where(:skin_id => skin_id).joins(:item).order("items.rating DESC")

Однако, если skin_id относится к другой модели - то есть Stat belongs_to :skin и Skin has_many :stats, тогда может иметь смысл начать с нее:

skin = Skin.find(1)
stats = skin.stats.order("rating DESC").includes(:item)

Чтобы получить предметызатем просто переберите их:

stats = skin.stats.order("rating DESC").includes(:item)

stats.each do |stat|
   stat.item
end

F

1 голос
/ 30 июня 2011

@ items = Item.join (: stats) .order ('skin_id DESC')

Полагаю, хотя я могу ошибаться, что присоединение к таблице приведет к тому, что вы установили связь.

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

Вы пробовали это?

Item.includes("stats").where('stats.skin_id = ?', 1).order("stats.rating desc")
0 голосов
/ 30 июня 2011

в рельсах 3 это будет что-то вроде:

Item.includes ("stats"). Order ("stats.skin_id desc")

...