6

मुझे लगता है कि यह वास्तव में बुनियादी है, लेकिन मैं एसक्यूएल के साथ भयानक तो मैं पता नहीं कैसे यह करने के लिए है हूँ ...रेल 3 HABTM रिकॉर्ड जुड़े मॉडल विशेषता के आधार पर लगता है

मैं दो मॉडलों के बीच एक मानक HABTM रिश्ता है , लैंडयूसे और फोटो। तो मैं एक land_uses_photos तालिका में शामिल होने के लिए है, और एक मॉडल की तरह, मानक मैक्रो है:

Photo 
has_and_belongs_to_many :land_uses 

भूमि के उपयोग की मेज है: आईडी, और नाम (स्ट्रिंग)।

मैं उन फ़ोटो को ढूंढना चाहता हूं जहां भूमि उपयोग नाम = 'foo', 'bar', या 'baz' है। मैं उसको कैसे करू?

मैं this question को देखा और कोशिश की:

Photo.includes(:land_uses).where('land_use.id'=>[6,7]) 

... लेकिन यह है कि मुझे दिया:

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

कि फर्जी है, यहाँ दोनों भूमि उपयोग के लिए schema.rb और तालिका में शामिल होने के लिए:

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 

तो, मैं इस तरह के खोज कैसे करूं? और इसे दो के बजाय केवल एक प्रश्न बनाने के लिए, मैं केवल "या" स्थिति की बजाय "और" स्थिति के साथ कैसे ढूंढ सकता हूं?

धन्यवाद!

उत्तर

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

यह किया था। धन्यवाद! – Andrew

+0

क्या आप जानते हैं कि 'जॉइन' और 'शामिल' के बीच क्या अंतर है? – Andrew

+2

जब आप एसोसिएशन डेटा लोड करना चाहते हैं तो 'शामिल' का उपयोग करें। यह तब उपयोगी होता है जब आप एन + 1 समस्या से बचना चाहते हैं। हर जगह 'जॉइन' का प्रयोग करें, क्योंकि यह एक बहुत ही सरल और तेज़ एसक्यूएल उत्पन्न करता है। –

1

आप जनरल तालिका नाम के बाद से कोई 'आईडी' त्रुटि है: land_uses और नहीं land_use

+0

ओह, ठीक है, तो तालिका का नाम मॉडल का नाम नहीं है ... अभी भी सीख रहा है, लेकिन इससे मदद मिलती है, धन्यवाद! – Andrew

संबंधित मुद्दे