Rails ActiveRecord关系 - 避免写.blank?检查

时间:2013-01-10 00:35:22

标签: ruby-on-rails rails-activerecord

这更像是一个风格问题。

在编写查询时,我总是发现自己正在检查查询的结果是否为空白,而且似乎 - 我不知道,在某种程度上过于冗长或错误。

EX。

def some_action
  @product = Product.where(:name => params[:name]).first
end

如果没有名称= params [:name]的产品,我会得到一个零值的东西。

我接着写了这样的东西

def some_action
  product = Product.where(:name -> params[:name])
  @product = product if !product.blank?
end

是否有更简洁的方法来处理零值和空白值?当事情依赖于其他关系时,这会变得更加令人头痛

EX。

def some_action
  @order = Order.where(:id => params[:id]).first
  # if order doesn't exist, I get a nil value, and I'll get an error in my app
  if !@order.nil?
    @products_on_sale = @order.products.where(:on_sale => true).all
  end
end

基本上,是否有一些我没有的东西;但是还是学会了处理nil,空白并且可能更有效地查看破坏实例变量?

由于

2 个答案:

答案 0 :(得分:3)

如果它只是风格相关,我会看看Rails的Object#try方法,或者考虑类似andand的内容。

使用您的示例,尝试:

def some_action
  @order = Order.where(:id => params[:id]).first
  @products_on_sale = @order.try(:where, {:onsale => true}).try(:all)
end

或使用andand:

def some_action
  @order = Order.where(:id => params[:id]).first
  @products_on_sale = @order.andand.where(:onsale => true).andand.all
end

答案 1 :(得分:2)

即使你在控制器中找到“零破坏事物”,你仍然会在你的视图中遇到这个问题。在您的控制器中添加一个if语句并将视图重定向到“未找到”页面,而不是在您的视图中使用多个if更容易。

或者你可以添加这个

protected
  def rescue_not_found
  render :template => 'application/not_found', :status => :not_found
end

application_controller。点击此处:https://ariejan.net/2011/10/14/rails-3-customized-exception-handling