0

Section多くの記事があると呼ばれるモデルがあります( Article)。これらの記事はバージョン管理されており(名前の列にはversionバージョン番号が格納されています)、最新のものを取得したいと思います。

section_id2からすべての記事を取得するSQLクエリは次のとおりです。

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

私は運が悪かったのですが、ArticleModelクラスで次のように見える名前付きスコープを作成しようとしてきました。

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できる限りハイレベルに保つように努めているので、使用を終了したくありません。任意の提案や洞察を歓迎します。前もって感謝します!

4

1 に答える 1

0

私は、バージョン管理された、またはバージョンfuまたは何か他のものとして機能するようなバージョン管理のためのいくつかのプラグインを見てみます。

現在のように機能させたい場合は、最新バージョンかどうかを示すブール列を追加します。実行して各列に追加し、最新のデータを取得するのは簡単です。コールバックを保存することで、簡単に最新の状態に保つことができます。

次に、ブール値をチェックする記事の最新の名前付きスコープを追加できます

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

したがって、セクションに対して次のことができます。

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

更新: dbスキーマには何も追加できないため、名前付きスコープでの試みを振り返りました。

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)

セクションをラムダにスローする必要があるのは最もクリーンではありませんが、オブジェクトのロードの後半まで利用できるものがあまりないため、別の方法はないと思います。そのため、バージョンが失敗していました。

于 2009-11-14T16:35:47.747 に答える