检查控制器在Rails中是否存在logging
在我的应用程序中,用户可以创build一个业务。 当他们触发我的BusinessesController
的index
操作时,我想检查一个业务是否与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