【问题标题】:Checking if ActiveRecord find returns a result检查 ActiveRecord find 是否返回结果
【发布时间】:2011-02-21 10:17:00
【问题描述】:

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

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

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

【问题讨论】:

标签: ruby-on-rails ruby activerecord


【解决方案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

【讨论】:

  • 一个兴趣点,如果你只是使用 find() 和主键(不使用 :all 或 :first),如果没有找到它会引发异常。
【解决方案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 页面。

    【讨论】:

    • 加一个 BANG!
    【解决方案4】:

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

    post.empty?
    

    将返回 true。

    【讨论】:

      【解决方案5】:

      这可能就像将您的取景器更改为一样简单:

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

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

      if post
        # do something
      else
        # do something else
      end
      

      【讨论】:

        【解决方案6】:
        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
        

        对不起,我有点走神了

        【讨论】:

          【解决方案7】:

          另一种方法是检查ActiveRecord#any?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 2010-09-22
            相关资源
            最近更新 更多