两种型号:
发票
:invoice_num string
:date datetime
.
.
:disclaimer_num integer (foreign key)
声明
:disclaimer_num integer
:version integer
:body text
对于每个disclaimer
,有多个版本,并将保存在数据库中。这就是我编写搜索(简化)的方法:
scope = Invoice.scoped({ :joins => [:disclaimer] })
scope = scope.scoped :conditions => ["Invoice.invoice_num = ?", "#{params[:num]}"]
scope = scope.scoped :conditions => ["Disclaimer.body LIKE ?", "%#{params[:text]}%"]
但是,上述搜索将再次搜索免责声明的所有版本。如何将搜索限制为仅限 last 免责声明(即version
整数是最大值)。
请注意:
发票未保留版本号。新的免责声明将被添加到免责声明表中并保留旧版本。
答案 0 :(得分:2)
如果您只想使用免责声明中包含最新版本的发票,请在disclaimer_num
上添加条件。我还建议在Disclaimer
中创建一个帮助方法,以使代码更清晰。
class Disclaimer < ActiveRecord::Base
def latest
find(:first, :order => "version DESC")
end
end
scope = scope.scoped :conditions => { :disclaimer_num => Disclaimer.latest }
我真的希望你为了简洁而从你的范围中删除sql注入防护代码。
答案 1 :(得分:0)
嗯......我可能只是对存储过程感到高兴,但我认为在这一点上你会从存储过程(甚至视图)中获益很多,这样做是这样的:
CREATE PROCEDURE GetRecentDisclaimer @BodyFragmentBeingSearched varchar(200) 如 SELECT MAX(版本),disclaimer_num,body 免责声明 哪里 body LIKE @BodyFragmentBeingSearched GROUP BY disclaimer_num,正文
从那里,有人写了一篇关于你如何在Rails中调用存储过程并填充ActiveRecord对象的博客,请在此处查看:
http://nasir.wordpress.com/2007/12/04/stored-procedures-and-rails-part-2/
答案 2 :(得分:0)
添加这两个条件(可以在范围内完成):
"ORDER BY disclaimer.disclaimer_num DESC"
"LIMIT 0, 1"