Первые 10 пунктов в отношениях «многие ко многим» в RoR - PullRequest
1 голос
/ 05 октября 2009

У меня есть база данных с двумя таблицами: теги и элементы.

У каждого предмета есть оценка, самые популярные предметы - самые популярные. Между тегами и элементами существует отношение многие ко многим.

Получить все элементы, принадлежащие тегу, легко. (= tag.items) Но как мне найти 10 самых популярных предметов, принадлежащих этому тегу?

Так что на самом деле мне нужен рубиновый эквивалент
SELECT * from items INNER JOIN item_tags ON items.id = item_tags.item WHERE item_tags.tag = :tagid ORDER BY items.score DESC LIMIT 10

Поскольку в теге может быть много элементов, я предпочитаю, чтобы база данных выполняла эту работу, а не извлекала все элементы и затем фильтровала их вручную. (и если есть более быстрый способ выполнить эту операцию, это, безусловно, приветствуется!)

1 Ответ

4 голосов
/ 05 октября 2009

При условии следующей настройки:

class Item < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :items
end

Вы должны быть в состоянии сделать:

@tag = Tag.find(PARAMS)
@tag.items.find(:all, :order => "items.score DESC", :limit => 10)

Если вы хотите сделать его еще более гладким, добавьте эту строку в класс предметов:

named_scope :popular, :order => "items.score DESC", :limit => 10

Вы можете позвонить

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