【发布时间】:2011-02-21 10:17:00
【问题描述】:
我正在尝试检查 find 方法是否返回结果。我的查找方法如下:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
检查post 是否包含结果的好方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby activerecord
我正在尝试检查 find 方法是否返回结果。我的查找方法如下:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
检查post 是否包含结果的好方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby activerecord
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'] })
使用此查找器,post 将返回单个值或 nil。因为 nil 在条件语句中的行为类似于 false,所以您可以这样说:
if post
# do something
else
# do something else
end
【讨论】:
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
对不起,我有点走神了
【讨论】:
另一种方法是检查ActiveRecord#any?。
【讨论】: