Postgresql, zapytanie "LIKE"

Witam,

Od nie dawna zacząłem przygodę z railsami, po paru tutorialach udało mi się stworzyć prostą bazę danych i wrzucić na
serwer, niestety po przeniesieniu na serwer i zmianie bazy danych na postgresql, nie działa mi wyszukiwanie po peselu.
Tzn wykonuję się ale nie znajduję danego peselu.

Production.log

Processing by PatientsController#index as HTML
[2016-01-09T12:05:58.327453 #23215] INFO – : Parameters: {“utf8”=>“✓”, “search”=>“94121400175”, “commit”=>“Szukaj”}
D, [2016-01-09T12:05:58.330829 #23215] DEBUG – : ^[[1m^[[35mPatient Load (0.6ms)^[[0m SELECT “patients”.* FROM “patients” WHERE (‘Pesel’ LIKE ‘94121400175’) ORDER BY created_at DESC
I, [2016-01-09T12:05:58.331365 #23215] INFO – : Rendered patients/index.html.erb within layouts/application (2.2ms)

Model

class Patient < ActiveRecord::Base
validates_presence_of :Imie, :Nazwisko, :Miejscowosc, :Pesel, :NrPolisaUbezp, :Telefon
validates_uniqueness_of :Pesel
validates_length_of :Imie, :Nazwisko, :Miejscowosc, :maximum=>30
validates_length_of :Pesel, :minimum=>11, :maximum=>11
validates_length_of :Telefon, :minimum=>9, :maximum=>9
validates_numericality_of :Nrmieszkania, :Nrdomu, :less_than=>100

def self.search(query)
	where("'Pesel' LIKE ?", "#{query}") 
end

end

Adres do aplikacji w github https://github.com/smuga1/deploy_test

PS: Wiem że zrobiłem błąd pisząc nazwy kolumn w tabeli z wielkiej litery :slight_smile:

Spróbuj przy nazwie kolumny bez ’ ’ :wink:

def self.search(query)
	where("Pesel LIKE ?", "#{query}") 
end

P.S
Dobrą praktyką jest nazywanie wszystkiego po angielsku, unikniesz większej ilości problemów, ale to tak tylko dopowiem :wink:

Skoro szukasz tylko po peselu (domyślam się, że jest to string) to dlaczego nie chcesz użyć where w taki sposób (skoro metoda search szuka tylko po peselu):

Patient.where(pesel: "90010112345")

Jeżeli chcesz szukać w taki sposób, sugeruję:

def self.search(query)
  where("Pesel LIKE ?", "%#{query}%") 
end

Możliwe, że w jakiś sposób do peselu zostałe dodane białe znaki, wtedy wyszuka numeru PESEL i wszystkie co może być przed i za nim (czyli jakieś ekstra znaki).

@viceversa

Twój sposób zadziała tylko jeżeli nazwa kolumny będzie napisana z małej litery, przerabiałem to już :).

Popełniłem błąd nazywając kolumny z wielkich liter :), bo teraz muszę się bawić w te pojedyncze apostrofy.

@Neologis

Spróbuje Twojego sposobu

EDIT: Ok, wszystko działa, dzięki za pomoc

Sądzę, że mamy do czynienia z pewnym pomieszaniem spraw.
Po pierwsze, to zapis:

1) SELECT * FROM patients WHERE pesel =

nie jest tożsamy z zapisem:

2) SELECT * FROM patients WHERE pesel LIKE  

Konwencja:

 Patient.where(pesel: "90010112345") 

odpowiada wersji 1), czyli użycia “=” i mówi:
"Wybierz rekordy które w kolumnie pesel mają wartość DOKŁADNIE ‘9010112345’ ",
a zapis z użyciem 2) “LIKE” mówi:
"Wybierz rekordy które w kolumnie pesel mają wartość PODOBNĄ DO ‘9010112345’ "

W załączonym przykładzie będzie to bez znaczenia, ale już zastosowanie “%” w

def self.search(query)
  where("Pesel LIKE ?", "%#{query}%") 
end

powoduje istotne zmiany, bo możesz podać nawet tylko część ciągu “101123” co zostanie zamienione na zapytanie

SELECT * FROM patients WHERE pesel LIKE ‘%101123%’
…czyli szukanie rekordów, gdzie w kolumnie PESEL występuje ciąg znaków “101123”

A osobiście też miałem kiedyś problem z wyszukiwaniem po PESEL i pamiętam, że związane to było z "wycinaniam ZERA “0” (poprzedzającego liczbę dla osób urodzonych po 2000 roku) w czasie jakieś konwersji z arkusza, gdzie traktował ciąg jako liczbę, a nie jako string. Tutaj szukaj “miny”