2011-11-07 121 views
1

在下面的查询我得到的对象作为返回值(并因此检查使用.nil没有结果工作得很好:ActiveRecord ::关系问题检查是否为零? - Rails的3.1

store = Store.where(:some_id => myobj.some_id.to_i).first 
    unless store.nil? 

但在这接下来的代码中,我得到的返回类型? ActiveRecord的::关系,并检查使用.nil?失败!

existing_store = Store.where(:some_str => myobj.some_str).not_hidden().active() 
if existing_store.nil? 

1.这是为什么?

2.在这种情况下,我该如何检查结果?

3.我怎么能检查是否有记录,使用find()或者()

的Rails 3.1确实令这混乱的时候一般返回。

+0

'not_hidden'和'active'的范围我认为不是问题的行为?而调用'#nil?'究竟返回的是什么? – tbuehlmann

+0

是的,那些是范围......并调用.nil?总是为false,因为返回值是一个空数组(因此从不nil) – Hopstream

+0

正如下面已经建议的那样,我会使用'#empty?'。 – tbuehlmann

回答

7

使用blank?nil?是真实的,如果它真的nil(的NilClass单一实例),但你的第二个例子总是会返回一个数组,可能为空,如果没有结果,但是阵列不过。 blank?检查空数组,空字符串,nil和false值。

如果你有blank?预期可以检查first.nil?

+0

经过广泛的测试后,'blank?'和'present'是相反的'原来是测试活动记录返回值的最佳选项。 – Hopstream

3

因为在第一种情况下,您尝试检查secound中的实例,得到Array,并且数组不是nil,它的Array即使其为空。你应该使用empty?来检查这个!

+0

但我得到一个数组,即使我做.first()在第二个查询。 – Hopstream

+0

真的,当您尝试使用Store.where(:some_str => myobj.some_str).first.class'时会返回什么? – davidb

+0

ActiveRecord :: Relation - 我正在使用rails 3.1 – Hopstream