উত্তম:
Person.includes(:friends).where( :friends => { :person_id => nil } )
এইচএমটিটির জন্য এটি মূলত একই জিনিস, আপনি নির্ভর করে যে কোনও বন্ধুবিহীন ব্যক্তির কোনও যোগাযোগ থাকবে না:
Person.includes(:contacts).where( :contacts => { :person_id => nil } )
হালনাগাদ
has_one
মন্তব্যগুলিতে একটি প্রশ্ন পেয়েছেন , তাই কেবল আপডেট হচ্ছে। এখানে কৌশলটি includes()
সমিতির where
নামটি প্রত্যাশা করে তবে সারণির নামটি প্রত্যাশা করে। কোনও has_one
সংস্থার জন্য সাধারণত একবচনতে প্রকাশ করা হবে, যাতে পরিবর্তন হয় তবে where()
অংশটি যেমন থাকে তেমন থাকে। সুতরাং যদি Person
কেবল has_one :contact
তবেই আপনার বক্তব্যটি হ'ল:
Person.includes(:contact).where( :contacts => { :person_id => nil } )
আপডেট 2
কেউ বিপরীত সম্পর্কে জিজ্ঞাসা করেছেন, বন্ধু নেই লোকে। যেমন আমি নীচে মন্তব্য করেছি, এটি আসলে আমাকে উপলব্ধি করেছে যে শেষ ক্ষেত্রটি (উপরে: দ্য :person_id
) আসলে আপনি যে মডেলটি ফিরে আসছেন তার সাথে সম্পর্কিত হতে হবে না, এটি কেবল যোগদানের টেবিলে একটি ক্ষেত্র হতে হবে। তারা সব হতে যাচ্ছে nil
তাই এটি তাদের যে কোনও হতে পারে। এটি উপরোক্তগুলির একটি সহজ সমাধানের দিকে নিয়ে যায়:
Person.includes(:contacts).where( :contacts => { :id => nil } )
এবং এরপরে কোনও লোককে না দিয়ে বন্ধুদের ফেরাতে এটিকে পরিবর্তন করা সহজতর হয়ে ওঠে, আপনি কেবল সামনের অংশে পরিবর্তন করুন:
Friend.includes(:contacts).where( :contacts => { :id => nil } )
আপডেট 3 - রেল 5
অ্যালসনকে চমৎকার রেল ৫ টি সমাধানের জন্য ধন্যবাদ (নীচে তার উত্তরের জন্য তাকে কিছু + 1 দিন), আপনি সমিতিটি left_outer_joins
লোড করা এড়াতে ব্যবহার করতে পারেন :
Person.left_outer_joins(:contacts).where( contacts: { id: nil } )
আমি এটি এখানে অন্তর্ভুক্ত করেছি যাতে লোকেরা এটি খুঁজে পেতে পারে তবে তিনি এর জন্য +1 এর প্রাপ্য। দুর্দান্ত সংযোজন!
আপডেট 4 - রেল 6.1
আগামী 6.1 এ আপনি এটি করতে পারেন যে উল্লেখ করার জন্য টিম পার্ককে ধন্যবাদ :
Person.where.missing(:contacts)
ধন্যবাদ তিনি যে পোস্টটি দিয়েছিলেন।