2015-12-28 12 views
5

Modellerimde (User) ve öykü (Story) var: user has_many stories.Ruby on Rails: #any? yanlış değer döndürür

benim kabuğunda garip bir şey fark ettik:

Bu nasıl çalışıyor
(dev) user.stories.any? 
=> true 

(dev) user.stories 
    Story Load (1.6ms) SELECT "stories".* FROM "stories" WHERE "stories"."user_id" = 703 ORDER BY created_at ASC [["user_id", 703]] 
=> [] 

(dev) user.stories.any? 
=> false 

? Bu benim kodumdan mı kaynaklanıyor yoksa Raylar'da bir çeşit hata mı ve veritabanını sorgulama şekli mi?

user.stories.to_a.any? 
user.stories.to_a.empty? # also works with empty? 

Bu şekilde, raylar sorgu yapmak zorunda:

+0

Eğer İngilizce noktalama ne demek istedin @sawa? Daha hassas olabilir misin? Belli ki yerli bir konuşmacı değilim ve bazen hatanın nerede olduğunu anlamıyorum. – Mat

+1

Tamam. Kurallar daha sonra farklı dillerdir. Fransızcada, noktalama işaretinin iki bölümden oluştuğundan önce ve sonra boşlukları kullanırız. – Mat

+0

Raylarda aktif ilişkide olası hata var mı? http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-any-3F kaynağını görmek için http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method- i-empty-3F ve true değerini döndürürse "limit_value == 0" - veritabanına birden çok kez çarpmamak için bir optimizasyon olabilir mi? TEST ortamında raylarda da aynısını yapıp yapmadığını merak ediyorum. – house9

cevap

0

I bulunan bir çözüm (@ house9 sayesinde) kullanmaktır. Ve ek yük to_a.any? yaptıklarından bu yana oldukça düşük. @Jordan, kullanımını önerdiği gibi

Ya iyisi,:

user.stories.exists? 
+0

Tüm kullanıcı hikayelerini belleğe yükler. Hikaye bilgisini kullanmanız gerekmiyorsa, sadece 'user.stories.count> 0' kullanın. Tüm alanlarını seçmek ve bunları bir ruby ​​dizisine serileştirmek yerine db üzerinde basit bir sayım işlemi gerçekleştirecektir. –

+1

'say' kullanmayın, kullanın [' var olan var? '] (Http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-exists-3F). Bunun için böyle. –

+0

@Jordan Daha da iyisi. –