“部分”has_many版本“文章” - 我怎样才能得到最新鲜的子集?

时间:2009-11-13 20:13:09

标签: ruby-on-rails activerecord named-scope

我有一个名为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
)

我一直试图在Article模型类中以这样的方式制作命名范围:

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 :(得分:0)

我会看一些版本的插件,如acts as versionedversion 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并不是最干净的,但我不认为还有另一种方法,因为在对象加载后期你没有太多可用的东西,这就是为什么我认为你的版本失败了。