"Section" has_many versioned "Статьи" - Как я могу получить самое свежее подмножество? - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть модель с именем Section, в которой много статей (Article). Версии этих статей (в столбце с именем version хранится их номер версии), и я хочу получить самые свежие.

SQL-запрос, который извлекает все статьи из section_id 2:

SELECT * FROM `articles`
WHERE `section_id`=2
AND `version` IN
(
   SELECT MAX(version) FROM `articles`
   WHERE `section_id`=2
)

Я безуспешно пытался создать именованную область видимости для класса Article Model, которая выглядит следующим образом:

named_scope :last_version,
            :conditions => ["version IN 
                            (SELECT MAX(version) FROM ?
                             WHERE section_id = ?)", table_name, section.id]

Именованная область для извлечения любой нужной мне версии работает следующим образом:

named_scope :version, lambda {|v| { :conditions => ["version = ?", v] }}

Я бы не хотел прекращать использовать find_by_sql, так как я стараюсь держать все как можно выше на высоком уровне. Любые предложения или идеи будут приветствоваться. Заранее спасибо!

1 Ответ

0 голосов
/ 14 ноября 2009

Я бы взглянул на некоторые плагины для управления версиями, например действует как версионная или версия fu или что-то еще.

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

Затем вы можете добавить именованную область видимости для последних в Статьях, которые проверяют логическое значение

named_scope :latest, :conditions => ["latest = ?", true]

Итак, для раздела вы можете сделать:

Section.find(params[:id]).articles.latest

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

named_scope :last_version, lambda {|section| { :conditions => ["version IN 
                        (SELECT MAX(version) FROM Articles
                         WHERE section_id = ?)", section.id] } }

Затем вы сможете сделать

section = Section.find(id)
section.articles.last_version(section)

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

...