0

我想在添加下拉菜单时添加条件的 Rails 应用程序中进行 SQL 查询。显然,如果未选择下拉菜单,我不想使用空白条件进行搜索。如何在 SQL 语句中开发动态条件?

未经测试的例子:

未选择下拉菜单时: Object.find("billy," :conditions => {})

选择下拉列表时: Object.find("billy," :conditions => {"last_name => "johnson"})

谢谢您的意见!

4

4 回答 4

5

不太确定您在做什么,但实现此目的的一般方法是将下拉列表的值(不可见文本)作为您希望选择的对象的 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表单助手,您可以考虑将其用于下拉菜单。让生活更轻松:-)

于 2009-06-09T13:36:01.420 回答
3

假设您的 #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])

(都有些未经测试)

于 2009-06-09T13:38:16.050 回答
1

也许这个?

Object.find("billy", :conditions => last_name.nil? ? {} : {:last_name => last_name})
于 2009-06-09T13:34:35.073 回答
0

我为此使用SmartTuple。它很简单,但提供了一种构建“条件条件”的系统方法。

于 2010-07-23T18:50:57.063 回答