Проверка, если ActiveRecord находят возвраты результатом

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

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

Каков был бы хороший способ проверить это post содержит результат?

17
задан John Topley 19 May 2010 в 14:45
поделиться

5 ответов

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
25
ответ дан 30 November 2019 в 10:43
поделиться

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

7
ответ дан 30 November 2019 в 10:43
поделиться

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

post.empty?

вернет истину.

3
ответ дан 30 November 2019 в 10:43
поделиться

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

Post.exists?(:conditions => { :url => params['url'] })
12
ответ дан 30 November 2019 в 10:43
поделиться

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

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

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

if post
  # do something
else
  # do something else
end
2
ответ дан 30 November 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: