রেলস 4 এর জন্য:
সুতরাং, আপনি যা চাচ্ছেন তা হ'ল অভ্যন্তরীণ যোগদান, যাতে আপনার সত্যিকারের প্রিন্টে যোগ দেওয়া উচিত:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
তবে, রেকর্ডটির জন্য, যদি আপনি "নট নুল" শর্তটি চান তবে কেবল প্রাকটিকেটটি ব্যবহার করুন:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
নোট করুন যে এই সিনট্যাক্সটি অবমূল্যায়নের রিপোর্ট করেছে (এটি একটি স্ট্রিং এসকিউএল স্নিপেটের কথা বলে, তবে আমি অনুমান করি যে হ্যাশের শর্তটি পার্সারে স্ট্রিংয়ে পরিবর্তিত হয়েছে?), সুতরাং শেষগুলি উল্লেখগুলি যুক্ত করার বিষয়ে নিশ্চিত হন:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
প্রসারণ সতর্কতা: দেখে মনে হচ্ছে আপনি আগ্রহী লোডিং টেবিল (গুলি) (এর মধ্যে একটি: ....) যা স্ট্রিং এসকিউএল স্নিপেটে রেফারেন্স করা হয়েছে। উদাহরণ স্বরূপ:
Post.includes(:comments).where("comments.title = 'foo'")
বর্তমানে, অ্যাক্টিভ রেকর্ড স্ট্রিংয়ে থাকা টেবিলটিকে স্বীকৃতি দেয় এবং পৃথক ক্যোয়ারিতে মন্তব্যগুলি লোড করার পরিবর্তে মন্তব্যগুলিতে মন্তব্য সারণিতে যোগদান করতে জানে। তবে, একটি পূর্ণ-বর্ধিত এসকিউএল পার্সার না লিখে এটি করা সহজাত ত্রুটিযুক্ত। যেহেতু আমরা কোনও এসকিউএল পার্সার লিখতে চাই না, তাই আমরা এই কার্যকারিতাটি সরিয়ে দিচ্ছি। এখন থেকে, আপনি যখন স্ট্রিং থেকে কোনও টেবিলটি উল্লেখ করছেন তখন আপনাকে অবশ্যই সক্রিয় রেকর্ডটি বলতে হবে:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
true
রুবিতে মূল্যায়ন করে এবং আরেল একটি এসকিউএল কোয়েরিতে অনুবাদtrue
করে1
। সুতরাং উত্পন্ন উত্সাহটি আসলে আপনি যা চেয়েছিলেন তা হ'ল - এটি কোনও আর্ল বাগ ছিল না।