Я пытаюсь проверить, возвращает ли метод find результат. Мой метод поиска следующий:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
Что было бы хорошим способом проверить, что post
содержит результат?
Я пытаюсь проверить, возвращает ли метод find результат. Мой метод поиска следующий:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
Что было бы хорошим способом проверить, что post
содержит результат?
find :all
возвращает пустой массив ([]
), если строки не возвращаются, поэтому вы можете просто использовать его следующим образом:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
unless post.empty?
# do something...
end
Кстати, если вы find :all
, вы получите массив, а не одну строку. Если вы пытаетесь получить только одно сообщение, было бы проще использовать помощник find_by
или find :first
или просто first
:
post = Post.find_by_url params['url']
# or
post = Post.first :conditions => { :url => params['url'] }
# then...
if post
# do something...
end
Вы можете попробовать ActiveRecord:: Base.exists? перед
Post.exists?(:conditions => { :url => params['url'] })
Используйте BANG! версию метода find_by_url
, чтобы заставить его создать исключение, и его не удалось найти, а затем спасти позже в том же методе/действии.
def show
Post.find_by_url!(params[:url])
rescue ActiveRecord::RecordNotFound
flash[:notice] = "The URL you were looking for could not be found."
redirect_to root_path
end
end
Если вы не создали исключение, я считаю, что Rails отобразит страницу public/404.html.
Если сообщение не содержит результата, это будет пустой список, а затем:
post.empty?
вернет true.
это может быть так же просто, как изменить ваш искатель на:
post = Post.find(:first, :conditions => { :url => params['url'] })
С помощью этого искателя сообщение либо вернет одно значение, либо значение nil. Поскольку nil ведет себя как false в выражении условия, вы можете сказать что-то вроде следующего:
if post
# do something
else
# do something else
end
Post.find_by_id(id_column_value)
вернет нуль вместо того, чтобы взорвать вашу программу, когда она не может найти запись.
Конечно, там
x = Post.where(:any_column_name => value)
который всегда возвращает массив результатов. В этом случае вы можете просто запустить
x.each {|t| f(t) }
или
y = x.map {|t| f(t)}
или, конечно,
x[0], x[1], etc
Жаль, что я немного увлекся.
Другой способ сделать это - проверить с помощью ActiveRecord # any?.