检查控制器在Rails中是否存在logging

在我的应用程序中,用户可以创build一个业务。 当他们触发我的BusinessesControllerindex操作时,我想检查一个业务是否与current_user.id

  • 如果是:显示业务。
  • 如果否:redirect到new操作。

我试图使用这个:

 if Business.where(:user_id => current_user.id) == nil # no business found end 

但即使在业务不存在的情况下,它总是返回真实的…

如何testing数据库中是否存在logging?

为什么你的代码不起作用?

where方法返回一个ActiveRecord :: Relation对象(就像包含where的结果的数组一样), 它可以是空的,但它永远不会是nil

 Business.where(id: -1) #=> returns an empty ActiveRecord::Relation ( similar to an array ) Business.where(id: -1).nil? # ( similar to == nil? ) #=> returns false Business.where(id: -1).empty? # test if the array is empty ( similar to .blank? ) #=> returns true 

如何testing一条logging是否存在?

选项1:使用.exists?

 if Business.exists?(user_id: current_user.id) # same as Business.where(user_id: current_user.id).exists? # ... else # ... end 

选项2:使用.present? (或.present?.present?相反)

 if Business.where(:user_id => current_user.id).present? # less efficiant than using .exists? (see generated SQL for .exists? vs .present?) else # ... end 

选项3: if语句中的variables赋值

 if business = Business.where(:user_id => current_user.id).first business.do_some_stuff else # do something else end 

选项3b:variables赋值

 business = Business.where(user_id: current_user.id).first if business # ... else # ... end 

首先,您也可以使用.find_by_user_id(current_user.id)而不是.find_by_user_id(current_user.id) .where(...).first


最佳select:

  • 如果您不使用Business对象: 选项1
  • 如果您需要使用Business对象: 选项3

在这种情况下,我喜欢使用exists? 由ActiveRecord提供的方法:

 Business.exists? user_id: current_user.id 

与“存在?”:

 Business.exists? user_id: current_user.id #=> 1 or nil 

与“任何?”:

 Business.where(:user_id => current_user.id).any? #=> true or false 

如果你使用.where的东西,一定要避免与范围的麻烦,更好地使用.unscoped

 Business.unscoped.where(:user_id => current_user.id).any? 

ActiveRecord#在哪里将返回一个ActiveRecord :: Relation对象(它永远不会是零)。 尝试使用.empty? 关于testing是否会返回任何logging。

当你调用Business.where(:user_id => current_user.id)你会得到一个数组。 此数组可能没有对象或一个或多个对象,但它不会为空。 因此,检查==零将永远不会是真的。

您可以尝试以下方法:

 if Business.where(:user_id => current_user.id).count == 0 

所以你检查数组中的元素的数量,并将它们比较为零。

或者你可以尝试:

 if Business.find_by_user_id(current_user.id).nil? 

这将返回一个或零。

 business = Business.where(:user_id => current_user.id).first if business.nil? # no business found else # business.ceo = "me" end 

我会这样做,如果你需要一个对象的实例variables来处理:

 if @business = Business.where(:user_id => current_user.id).first #Do stuff else #Do stuff end