Как я могу объединить: условия для моего запроса SQL - PullRequest
1 голос
/ 09 августа 2010

Давайте предположим, что у меня есть два разных условия

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

и

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

Есть ли способ объединить эти условия в один запрос?

Ответы [ 3 ]

3 голосов
/ 09 августа 2010

Вы можете определить метод для объединения условий. Например:

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}"]

Я не знаю, лучший ли это способ, но он работает!

3 голосов
/ 10 августа 2010

Вам нужен метод # 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")

Несмотря на то, что я связан с кодом ActiveRecord 3.0, он также работает под 2.3.

1 голос
/ 09 августа 2010

Я не совсем уверен, что понимаю, что вы хотите сделать, но это звучит так, как вы хотите: named_scope с (которые были изменены на scope s, если вы используете Rails 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.

Вы можете добавить столько условий, сколько хотите, таким образом.

Это то, что вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...