2010-04-30 9 views
0

je voudrais utiliser la fonction de searchlogic scope_procedure comme siPassage d'arguments à scope_procedure dans searchlogic

class MyModelObject < ActiveRecord::Base 
    scope_procedure :my_scope_proc, lambda { |p1, p2| { :conditions => "p1 >= #{p1} AND p2 < #{p2}" }} 
end 

Ensuite, je fais la recherche:

scope = MyModelObject.search(:my_scope_proc => true) 
scope.all 

Le code ci-dessus ne fonctionne évidemment pas parce que je n'ai pas passé les paramètres p1 et p2 à ma portée nommée.

Je n'arrive pas à comprendre comment transmettre des paramètres à la portée nommée.

Répondre

0

j'ai pu le faire fonctionner avec un paramètre comme suit:

class MyModelObject < ActiveRecord::Base 
    scope_procedure :my_scope_proc, lambda { |p| p1_gte(p[0]).p2_lt(p[1]) } 
end 

scope = MyModelObject.search(:my_scope_proc => [p1, p2]) 
scope.all 
1

Une estimation sauvage (ce qui signifie, je n'ai pas vérifié!):

scope = MyModelObject.search(:my_scope_proc => [p1, p2]) 
scope.all 

Une suggestion pour le scope_procedure:

class MyModelObject < ActiveRecord::Base 
    scope_procedure :my_scope_proc, lambda { |p1, p2| { :conditions => ["p1 >= ? AND p2 < ?", p1, p2] }} 
end 

Cela empêche l'injection SQL.

Ou la façon searchlogic:

class MyModelObject < ActiveRecord::Base 
    scope_procedure :my_scope_proc, lambda { |p1, p2| p1_gte(p1).p2_lt(p2) } 
end 
+0

Merci beaucoup pour votre suggestion. Bien que cela n'ait pas fonctionné, cela m'a conduit à une solution. Cela fonctionne avec un seul paramètre et uniquement avec la méthode searchlogic. J'ai fini par passer un tableau de paramètres. Pas le code le plus lisible ou la solution élégante mais cela fonctionne. – GregK