我们假设我有两种不同的条件
:conditions => ["base == ?", self.search_text]
和
:conditions => ["status = ?", "#{self.status}"]
有没有办法将这些条件合并到一个查询中?
答案 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.
您可以通过这种方式添加任意数量的条件。
这是你想要做的吗?