如何在这个activerecord示例中搜索?

时间:2010-05-28 01:57:07

标签: ruby-on-rails activerecord

两种型号:

发票

  :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整数是最大值)。

请注意:

发票未保留版本号。新的免责声明将被添加到免责声明表中并保留旧版本。

3 个答案:

答案 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"