在Rails 3中,我创建了一个搜索表单,在模型文件中使用条件执行查找。
@projects = find(:all,
:select => 'projects.*',
:conditions => ['name = ?', search_name]
).first
如果在searchform(search_name)中提供了名称,则此方法很有用。问题是如果search_name为空,Rails错误(不能说我责备它)......
处理这种情况的聪明方法是什么?我想,如果search_name为空,则不是错误,而是返回所有内容。
连连呢?谢谢!
答案 0 :(得分:5)
您可以创建一个范围来处理此问题。在项目模型中,添加如下内容:
scope :search_by(name), lambda{|name| first.where(:name => name) unless name.blank?}
然后在您的控制器中,只需致电:
Project.search_by(params[:search])
编辑:
如果您需要搜索多个字段,您可以调整范围:
范围:search_by(name),lambda {| name | first.includes(:owner).where(“projects.name LIKE?OR owners.name LIKE?”,name,name)除非name.blank?}
答案 1 :(得分:3)
if search_name.blank?
@projects = Project.order(:name)
else
@projects = Project.where(:name => search_name)
end
答案 2 :(得分:1)
最干净的方法是使用延迟加载和新的ActiveRecord功能,如下所示:
@projects = Project.order(:name) @projects = @ projects.where(:name => search_name)if search_name
您可以通过这种方式添加任意数量的条件。在你需要结果之前不会执行它们(使用@project.all或@project.each等...)