Raylar

6

Ben Raylar

İki model arasındaki standart HABTM ilişki var ... Bu gerçekten basit ama ben bu yüzden nasıl yapılacağını bilmiyorum SQL ile çok kötüyüm düşünüyorum , LandUse ve Fotoğraf. Bu yüzden bir land_uses_photos masaya katılmak zorunda ve her model gibi, standart makro vardır:

Photo 
has_and_belongs_to_many :land_uses 

arazi kullanım tablosu vardır: Kimlik ve Ad (dize).

Arazi Kullanımı Adı = 'foo', 'bar' veya 'baz' öğelerini bulmak istiyorum. Bunu nasıl yaparım?

Ben this question bakıp çalıştı:

Photo.includes(:land_uses).where('land_use.id'=>[6,7]) 
... ama bu bana verdi: sahte olduğunu

ActiveRecord::StatementInvalid: No attribute named `id` exists for table `land_use` 

, burada hem arazi kullanımı için schema.rb ve katılmak tablo var:

create_table "land_uses", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "display_order" 
end 

create_table "land_uses_photos", :id => false, :force => true do |t| 
    t.integer "land_use_id" 
    t.integer "photo_id" 
end 

Peki, bu tür bir bulmayı nasıl yapabilirim? Ve iki yerine sadece bir soru yapmak için, sadece bir "ya da" koşulu yerine "ve" koşulunu nasıl bulabilirim?

Teşekkürler!

cevap

7
Photo.joins(:land_uses).where('land_uses.name' => ['foo', 'bar', 'baz']) 
+0

. Teşekkürler! – Andrew

+0

'joins' ile' includes' arasındaki farkın ne olduğunu biliyor musunuz? – Andrew

+2

İlişkilendirme verilerini yüklemek istediğinizde 'includes' kullanın. Bu, N + 1 sorununu önlemek istediğinizde kullanışlıdır. Çok daha basit ve daha hızlı bir sql oluşturduğundan, 'her yerde 'birleştirme' özelliğini kullanın. –

1

Eğer tablo adı beri Bir 'kimlik' hatadır gen: land_uses ve bu yaptığını değil land_use

+0

Oh, tamam bu yüzden masa adı model ismi değil ... hala öğreniyor, ama bu yardımcı oluyor, teşekkürler! – Andrew