我有一个名为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
,因为我正努力让所有人保持高水平。任何建议或见解都将受到欢迎。提前谢谢!
答案 0 :(得分:0)
我会看一些版本的插件,如acts as versioned或version 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并不是最干净的,但我不认为还有另一种方法,因为在对象加载后期你没有太多可用的东西,这就是为什么我认为你的版本失败了。