检查ActiveRecord是否返回结果

时间:2010-05-19 14:34:15

标签: ruby-on-rails ruby activerecord

我正在尝试检查find方法是否返回结果。我的find方法如下:

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

检查post是否包含结果的好方法是什么?

7 个答案:

答案 0 :(得分:25)

如果没有返回任何行,

find :all将返回一个空数组([]),因此您可以这样使用它:

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

unless post.empty?
  # do something...
end

顺便说一句,如果你做find :all,你将得到一个数组,而不是一行。如果您只想获得一个帖子,那么使用find_by助手或find :firstfirst代替更为清晰:

post = Post.find_by_url params['url']

# or

post = Post.first :conditions => { :url => params['url'] }

# then...

if post
  # do something...
end

答案 1 :(得分:12)

您可以在

之前尝试ActiveRecord::Base.exists?
Post.exists?(:conditions => { :url => params['url'] })

答案 2 :(得分:7)

使用find_by_url方法的 BANG!版本来获取它无法找到的异常,然后在相同的方法/操作中将其解救。< / p>

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 页面。

答案 3 :(得分:3)

如果post不包含任何结果,则它将是一个空列表,然后:

post.empty?

将返回true。

答案 4 :(得分:2)

可能就像将您的取景器更改为:

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

使用此finder,post将返回单个值或nil。因为在条件语句中nil的行为类似于false,所以您可以这样说:

if post
  # do something
else
  # do something else
end

答案 5 :(得分:1)

Post.find_by_id(id_column_value)

在找不到记录时会返回nil而不是炸毁你的程序。

当然,有

x = Post.where(:any_column_name => value) 

始终返回结果数组。在这种情况下,您可以运行

x.each {|t| f(t) }

y = x.map {|t| f(t)}

当然,

x[0], x[1], etc

对不起,我有点被带走了

答案 6 :(得分:0)

另一种方法是使用ActiveRecord#any?进行核对。