Два параметра для области действия Rails3

В настоящее время у меня есть две модели: Rate и Item.

Rate – это модель голосования, а также votes и player_id.

Оценить has_many :votes Голосовать own_to :rate

Кроме того, для модели Item в настоящее время у меня есть такая область, как:

scope :pop, proc { order('votes.votes DESC') }

чтобы отсортировать все элементы по голосу.

Вопрос в следующем: мне нужно собирать предметы, отсортированные (Item.all.pop) И по player_id Что-то вроде: Item.all.pop(player_id)

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

Обновление:

rate.rb

class Rate < ActiveRecord::Base
  belongs_to :player
  belongs_to :item
end

item.rb

class Item < ActiveRecord::Base
  has_many :rates
  scope :pop, proc { order('rates.votes DESC') }
end

person There Are Four Lights    schedule 20.06.2011    source источник


Ответы (1)


ОБНОВЛЕНИЕ: (на основе обновлений публикации и пояснений комментариев)

Вы, вероятно, хотите что-то вроде этого:

scope :pop, order('stats.votes DESC')

scope :for_player, lambda{|player| joins(:rates).where(:player_id => player.id)}

Тогда вы сможете позвонить Item.for_player(@my_player).pop.

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


(Оригинальный ответ)

Вы, вероятно, хотите что-то вроде этого:

scope :pop, order('stats.votes DESC')

scope :by_player, group('player_id')

Затем вы сможете сделать Item.by_player.pop и получить то, что хотите. (Вы можете проверить в консоли с помощью Item.by_player.pop.to_sql, чтобы увидеть, сгенерирован ли ожидаемый запрос SQL.)

person David Sulc    schedule 20.06.2011
comment
Эй, Дэвид! Да, но проблема в том, что player_id является частью модели Rate, а не Item (например, Rate — это модель голосования, а есть voices и player_id). Кроме того, мне нужно что-то вроде Item.by_player(current_player.id).pop. Есть предложения? - person There Are Four Lights; 21.06.2011
comment
Можете ли вы описать взаимосвязь между Item и Rate? - person David Sulc; 21.06.2011
comment
Да, а как насчет Item (в первой строке)? Является ли пункт таким же, как голосование? - person David Sulc; 21.06.2011
comment
Обновлено. Итак, обычно в контроллере я хочу что-то вроде: @items = Item.all.by_player(current_user).pop - person There Are Four Lights; 21.06.2011
comment
При заказе (stats.votes DESC) выполняется поиск по всем голосам в Stat. Но я должен охватывать не все записи, а записи с указанным player_id. - person There Are Four Lights; 21.06.2011