2010-08-09 7 views

Répondre

3

Qu'est-ce que vous cherchez est la méthode #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") 

Bien que je lié à la 3.0 Code ActiveRecord, cela fonctionne aussi sous 2.3.

+0

Je dois rejoindre 2 tables donc j'ai ajouté: joint param à scoped – Bohdan

1

Je ne suis pas exactement sûr de comprendre ce que vous cherchez à faire, mais il semble que ce que vous voulez soit named_scope s (qui a été changé en scope s si vous utilisez Rails 3).

Dans votre modèle, vous pouvez définir des étendues nommées dynamiques:

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

Et vous pouvez utiliser ces champs comme viseurs:

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

Vous pouvez ajouter autant de conditions que vous vouliez cette façon.

Est-ce ce que vous essayez de faire?

+0

Ce n'est pas tout à fait que j'ai besoin d'écrire de telles conditions manuellement mais j'ai besoin de code qui les fusionne et dépend du nombre de conditions – Bohdan

+0

Oh, gotcha, j'ai mal compris ce que vous demandiez. –

+0

Oui, je vais essayer des portées nommées – Bohdan

3

Vous pouvez définir une méthode pour fusionner les conditions. Par exemple:

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 

et utiliser

merge_conditions([first_condition, second_condition]) 

Cela renverra

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

Je ne sais pas si cela est la meilleure façon, mais ça marche!

+0

Merci pour l'idée, je vais essayer votre solution aussi – Bohdan

+0

Je l'ai fait moi-même. Vous cherchez un moyen intégré. Je suppose que non :) –

Questions connexes