Проверка того, возвращает ли ActiveRecord результат

Я пытаюсь проверить, возвращает ли метод find результат. Мой метод поиска следующий:

post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)

Что было бы хорошим способом проверить, что post содержит результат?

Ответ 1

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

Ответ 2

Вы можете попробовать ActiveRecord:: Base.exists? перед

Post.exists?(:conditions => { :url => params['url'] })

Ответ 3

Используйте 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.

Ответ 4

Если сообщение не содержит результата, это будет пустой список, а затем:

post.empty?

вернет true.

Ответ 5

это может быть так же просто, как изменить ваш искатель на:

post = Post.find(:first, :conditions => { :url => params['url'] })

С помощью этого искателя сообщение либо вернет одно значение, либо значение nil. Поскольку nil ведет себя как false в выражении условия, вы можете сказать что-то вроде следующего:

if post
  # do something
else
  # do something else
end

Ответ 6

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

Жаль, что я немного увлекся.

Ответ 7

Другой способ сделать это - проверить с помощью ActiveRecord # any?.