我如何合并:我的SQL查询的条件

时间:2010-08-09 19:14:45

标签: sql ruby-on-rails activerecord

我们假设我有两种不同的条件

:conditions => ["base == ?", self.search_text]

:conditions => ["status = ?", "#{self.status}"]

有没有办法将这些条件合并到一个查询中?

3 个答案:

答案 0 :(得分:3)

您可以定义合并条件的方法。例如:

first_condition = ["base == ?", self.search_text]
second_condition = ["status = ?", "#{self.status}"]

def merge_conditions(array = [])
   conditions = array.map {|a| "(#{a.first})"}.join(' AND ')
   params = array.inject([]) {|new, a| new += a[1..a.size]}
   params.insert(0, conditions)   
end

并使用

merge_conditions([first_condition, second_condition])

这将返回

["(base == ?) AND (status = ?)", self.search_text, "#{self.status}"]

我不知道这是不是最好的方法,但它有效!

答案 1 :(得分:3)

您正在寻找的是#scoped方法:

base = Model
base = base.scoped(:conditions => {:base => params[:search_text]}) if params[:search_text].present?
base = base.scoped(:conditions => {:status => params[:status]}) if params[:status].present?
@results = base.all(:order => "created_at DESC")

虽然我链接到3.0 ActiveRecord代码,但这也适用于2.3。

答案 2 :(得分:1)

我不确定我理解你要做什么,但听起来你想要的是named_scope s(如果你正在使用Rails,那就改为scope s 3)。

在模型中,您可以定义动态命名范围:

named_scope :base, lambda { |value| { :conditions => { :base => value } } }
named_scope :status, lambda { |value| { :conditions => { :status => value } } }

然后您可以将这些范围用作查找程序:

results = Model.base(self.search_text).status(self.status) to join your conditions.

您可以通过这种方式添加任意数量的条件。

这是你想要做的吗?