我正在尝试检查find方法是否返回结果。我的find方法如下:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
检查post
是否包含结果的好方法是什么?
答案 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 :first
或first
代替更为清晰:
post = Post.find_by_url params['url']
# or
post = Post.first :conditions => { :url => params['url'] }
# then...
if post
# do something...
end
答案 1 :(得分:12)
答案 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?进行核对。