Klauzula OR w activerecord

Environment:
rails 3.0.3
ruby 1.9.2-head
meta_search
postgresql

q = Query.new("Tusk Donald, Kaczyński, Jan") q.envoys => {0=>{:name=>"Donald", :lastname=>"Tusk"}, 1=>{:lastname=>"Kaczyński"}, 2=>{:name=>"Jan"}}
Pytanie:

W jaki sposob moge zbudowac zapytanie ktore znajdzie.

Poslow z: :name => "Donald", :lastname => "Tusk" :lastname => "Kaczyński" :name => "Jan"
http://pastie.org/1406707 poslowie spelniajacy te warunki

ps: Jezeli jest podane tylko imie lub nazwisko, szukam wszystkich poslow ktorzy maja np na imie “Jan”

Pseudokod:

a = Model.where(:name => "Donald", :lastname=> "Tusk") => Zwroci 1 rekord b = Model.where(:lastname => "Kaczyński") => Zwroci 1 rekord c = Model.where(:name => "Jan") => => Zwroci 18 rekordow
Ja chce polaczyc te trzy zapytania w jedno ktore odrazu zwroci 20 rekordow

Może spróbuj coś takiego:

abc=Model.where(' (name = ? AND lastname = ?) OR lastname = ? OR name = ? ', "Donald", "Tusk", "Kaczyński", "Jan")

To wyjątkowo wyspecjalizowana potrzeba. Jeśli dobrze rozumiem: albo imię A, albo nazwisko B, albo jednocześnie imię i nazwisko C-D (czyli inne niż A-B, tzn. mamy 4 parametry wejściowe A, B, C, D).

Potrzedłbym do tego tak:

  1. Próba renegocjacji wymagań; prawdopodobnie jest to niepotrzebny feature
  2. Jeśli jednak potrzebny, trzeba napisać własny scope z fragmentem SQL-a (…OR…OR…) - trudno, zdarza się :slight_smile:

Możesz też przyjrzeć się pluginowi metawhere: http://metautonomo.us/projects/metawhere/

Dzieki :). Znalazlem metawhere chwile przed twoim postem. Railscast FTW

@envoys = Envoy.where((:name + ["Donald"]) | (:lastname + ["Tusk","Kaczyński"))

ps: + to operator arela ze zmieniona nazwa aby go miec trzeba dorzucic do initializers

    MetaWhere.operator_overload!

Dziwny ten plus, na pierwszy rzut oka wygląda bez sensu, ja bym użył 2 hashy:

Envoy.where({:name => ["Donald"]} | {:lastname => ["Tusk","Kaczyński"]})

albo 2 wywołań were:

Envoy.where(:name => ["Donald"]) | Envoy.where(:lastname => ["Tusk","Kaczyński"])

[quote=drogus]Dziwny ten plus, na pierwszy rzut oka wygląda bez sensu, ja bym użył 2 hashy:

Envoy.where({:name => ["Donald"]} | {:lastname => ["Tusk","Kaczyński"]})

albo 2 wywołań were:

Envoy.where(:name => ["Donald"]) | Envoy.where(:lastname => ["Tusk","Kaczyński"])

[/quote]
Wyglada ok. Male sprostowanie. Ta jedna linijka nie rozwiaze calego problemu ktory opisalem w pierwszym poscie ale jezeli ktos ja rozumie moze zbudowac algorytm ktory spelni te wymagania

Chodziło mi o to, że jeżeli pokażesz to programiście, który o metawhere nigdy nie słyszał, to na raczej nie będzie rozumiał o co chodzi. Przy | jest już lepiej, bo to jest OR logiczne, więc jest całkiem intuicyjne.

A mi chodzilo o to ze twoje rozwiazanie wyglada ok :slight_smile:

End of topic