2016-04-07 18 views
1

Kullanıcı tablo ve Mesajlar tablosuna sahip olduğumu varsayalım, bunlar has_many belongs_to ilişkisine sahiptir. Kimliği bulmak istiyorum: isimleri "Bob" olan kullanıcılar için, mesaj geçmişini kimliklerden biri için çekin.x = User.all bir karma yaratıyor mu? Nasıl geçebilirim?

x = User.where(name: "Bob") 

Bu, adı Bob olan tüm kullanıcı sonuçlarıyla birlikte x değişkeninde bir karma oluşturuyor mu? Konsolda sonuç, x çalıştırdığımda kesinlikle bir karma gibi görünüyor. Için tüm Bobs bağlı iletileri içerir, sanırım biliyorum:

x = User.where(name: "Bob").includes(:messages) 

Şimdi x olması ... Ben isimleri Bob kişilerin kimliklerini nasıl buluyorlar? Tekrar db'yi sorgulamak istemiyorum, hepsini değişken aracılığıyla yapmak istiyorum, bu mümkün mü?

Daha sonra, tablomdaki ilk kimliğin (ilk Bob) ilk iletisini almak istiyorum. Bu değişkenin üzerinden yapılabilir mi, yoksa ilk id'e sahip olduğumda DB'ye geri dönmek zorunda mıyım?

Tüm yardımcılar ve bayramlar için teşekkürler!

+0

Düzenlemeler için teşekkürler @Mischa! –

cevap

1

Çoğu ActiveRecord sorgusu Relation değerini döndürür.

Rayların gerçek sorguyu gerçekleştirmesini sağlamak için x = x.to_a numaralı telefonu arayabilir (2 SQL sorgusu olacaktır - biri kullanıcılar için, diğeri iletiler için) ve sonra sonuçta oluşan diziyi çaprazlar.

+0

Bu kadar! Teşekkürler Vasfed –

1

Bunu yapacaktır. Ray kılavuzlarında belirtildiği gibi. http://guides.rubyonrails.org/active_record_querying.html bölüm

x = Message.includes(:users).where(users: { name: "Bob"}) 

13,2 ve daha sonra ilk mesajı sadece sorgunun sonunda .first üzerinde çakmak alır.

x = Message.includes(:users).where(users: { name: "Bob"}).first 
0

İleti'den değil, Kullanıcıdan sorgulamanız gerekir. Katılır (iç birleştirme) ve içerir (sol dış birleştirme), sorunuzda olduğu gibi istekli yükleme için kullanılabilir veya birden çok tablo arasında sorgu yapmak için kullanılabilir.

Message.joins(:user).where('user.name = "bob"')