我想在添加下拉菜单时添加条件的 Rails 应用程序中进行 SQL 查询。显然,如果未选择下拉菜单,我不想使用空白条件进行搜索。如何在 SQL 语句中开发动态条件?
未经测试的例子:
未选择下拉菜单时: Object.find("billy," :conditions => {})
选择下拉列表时: Object.find("billy," :conditions => {"last_name => "johnson"})
谢谢您的意见!
我想在添加下拉菜单时添加条件的 Rails 应用程序中进行 SQL 查询。显然,如果未选择下拉菜单,我不想使用空白条件进行搜索。如何在 SQL 语句中开发动态条件?
未经测试的例子:
未选择下拉菜单时: Object.find("billy," :conditions => {})
选择下拉列表时: Object.find("billy," :conditions => {"last_name => "johnson"})
谢谢您的意见!
不太确定您在做什么,但实现此目的的一般方法是将下拉列表的值(不可见文本)作为您希望选择的对象的 ID。如果你没有选择,那么你可以使用这样的东西:
last_name = unless params[:object][:last_name]
conditions = []
conditions << "last_name = ?" unless last_name.blank?
conditions << last_name unless last_name.blank?
Object.find("billy", :conditions => conditions)
查看此链接以了解有关ActiveRecord::Base.find()
方法和正确使用方法的更多信息。还可以查看这个很棒的指南,了解如何保护自己免受 SQL 注入攻击。
编辑 1:修改后的代码更简洁。此方法还具有能够轻松添加单独条件的优点,只需确保添加所有“something =?” 在添加关联值(参数)之前。
编辑 2:如果您还没有看到select
表单助手,您可以考虑将其用于下拉菜单。让生活更轻松:-)
假设您的 #find 在控制器中,并且选择的值作为项目进入params
(如果没有,我认为您应该考虑更改内容!)那么您应该能够执行以下操作:
if params[:last_name] # or whatever it's actually called
Object.find("billy," :conditions => {'last_name = ?', params[:last_name]})
else
Object.find("billy")
end
如果您使用的是相当新的 ActiveRecord 版本(2.1 应该这样做,可能是 2.0),那么您可以将该逻辑转换为named_scope
:
class Object < ActiveRecord::Base
named_scope :for_last_name, lambda { |nm| { :conditions => nm.nil? ? {} : { last_name => nm } }
然后你的控制器归结为(我们喜欢瘦控制器)
Object.for_last_name(params[:last_name])
(都有些未经测试)
也许这个?
Object.find("billy", :conditions => last_name.nil? ? {} : {:last_name => last_name})
我为此使用SmartTuple。它很简单,但提供了一种构建“条件条件”的系统方法。