2009-01-01 12 views
5

Jestem całkiem nowy w Rails i byłem ciekawy, jakimi konwencjami posługują się eksperci, kiedy muszą skonstruować bardzo złożone zapytanie SQL, które zawiera wiele warunków. W szczególności, utrzymując kod czytelny i możliwy do utrzymania.Jaka jest konwencja dotycząca określania złożonych zapytań SQL w Railsach?

Istnieje kilka sposobów można myślę:

jednym wierszu, w zaproszeniu do find():

@pitchers = Pitcher.find(:all, "<conditions>") 

Użyj predefiniowanych ciąg i przekazać go w:

@pitchers = Pitcher.find(:all, @conditions) 

Użyj prywatną funkcję składową, aby powrócić zapytanie

@pitchers = Pitcher.find(:all, conditionfunction) 

W pewnym sensie pochylam się w kierunku konwencji funkcji prywatnych członków, dodatkowo, ponieważ można przekazać parametry, aby dostosować zapytanie.

Jakieś przemyślenia na ten temat?

Odpowiedz

7

Prawie nigdy nie przekazuję warunków do find. Zazwyczaj warunki te byłyby cenne, aby dodać do modelu obiektu w postaci named_scope lub nawet tylko metody klasy na modelu. Nazwane lunety są miłe, ponieważ można je łączyć, co wymaga odrobiny gryzienia złożoności. Pozwalają również na przekazywanie parametrów.

Ponadto, prawie nigdy nie należy po prostu przekazywać nieprzetworzonego ciągu warunkowego SQL. Powinieneś użyć stylu mieszania (:conditions => { :name => 'Pat' }) lub stylu tablicy (['name = ?', 'Pat']). W ten sposób SQL jest chroniony przed atakami SQL injection.

Wreszcie, myślę, że podejście, które rozważasz, gdzie próbujesz stworzyć warunki w dowolnym kontekście, który wywołujesz, to jest wadliwe podejście. Zadaniem modelu jest zapewnienie interfejsu, za pomocą którego zwracana jest stosowna odpowiedź. Próba określenia warunków przejścia na wywołanie find jest zbyt bliska podstawowemu wdrożeniu, jeśli mnie o to poprosisz. Plus trudniej jest przetestować.

+0

Doskonałe komentarze, dziękuję! – unknownuser

+0

Cieszę się, że mogę Ci pomóc. Pozwólcie, że was zapytam: w jakim kontekście nazywacie 'find'? Kontroler? Inny model? Mam nadzieję, że nie zobaczę :) – nakajima

+0

Ze sterownika. W ten sposób robię większość moich znalezisk. Spojrzę na popychanie ich do modelu. – unknownuser

Powiązane problemy