0

我有一个模型Section,它有很多文章(Article)。这些文章是版本化的(名为version存储它们的版本号的列),我希望检索最新的。

从 section_id 2 检索所有文章的 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)

需要将部分扔给 lambda 并不是最干净的,但我认为没有其他方法,因为在对象加载的后期你没有太多可用的东西,这就是为什么我认为你的版本失败。

于 2009-11-14T16:35:47.747 回答