Jaka jest roznica "if wynik.nil?" a "if wynik.empty?"

Witam

Ruby 1.9.2 i rails 2.3.8

Jak dotad to 100% chodzi:

wynik = tabela.find(:first,...) #TRUE if wynik end
To chodzi prawie zawsze:

wynik = tabela.find(:all,...) #TRUE if wynik.nil? end
Oprocz paru wyjatkow (inna tabela bazy) ze dzieje sie tak:

[code]wynik = tabela.find(:all,…)
#FALSE
if wynik.nil?
end

wynik = tabela.find(:all,…)
#TRUE
if wynik.empty?
end[/code]
Czemu tak sie dzieje, pomimo ze wynik jest identyczny patrzac przez <%= debug @wynik %> ?

Metoda nil? sprawdza czy obiekt jest NILem.
Pusta tablica zwracana przez find(:all) zdecydowanie nie jest nilem.
Nie ma różnicy, jakiego modelu używasz.

_duszek musisz też mieć świadomość co te metody zwracają.

Model.all

Zwróci zawsze tablicę, która może być pusta lub wypełniona obiektami Model. Model.first
zwróci albo nil albo obiekt Model.

tabela.find(:all ...)

Jeśli będziesz korzystać z Rails 3 to ta składnia jest przestarzała i chyba nie zadziała w 3.1.

Powienieneś wtedy przez takiego użyć takiej składni

tabela.all( ...)

Ale ja osobiście bardziej preferuje Model.where(" … ")

najlepiej w railsach sprawdzać to metodą #present?

[quote=“api.rubyonrails.org”]#present?
An object is present if it’s not blank?.

#blank?
An object is blank if it’s false, empty, or a whitespace string. For example, “”, “ ”, nil, [], and {} are all blank.[/quote]

[code=ruby]model = Model.all #=> []
model.present? #=> false

model = Model.first #=> nil
model.present? #=> false[/code]