রেলগুলিতে ছিদ্র এবং সংগ্রহের মধ্যে পার্থক্য কী?


123

এখানে দুটি নমুনা কোড রয়েছে।

এর সাথে প্রথমটি collect:

User.first.gifts.collect(&:id)

এর সাথে দ্বিতীয়টি pluck:

User.first.gifts.pluck(:id)

পারফরম্যান্সে বা অন্য কোনও কিছুর মধ্যে তাদের মধ্যে কোনও পার্থক্য রয়েছে?

উত্তর:


230

pluckডিবি স্তরে রয়েছে। এটি কেবলমাত্র নির্দিষ্ট ক্ষেত্রটিকেই জিজ্ঞাসা করবে। এই দেখুন

যখন তুমি কর:

 User.first.gifts.collect(&:id)

আপনার সমস্ত ক্ষেত্রের সাথে বস্তুগুলি লোড হয়েছে এবং আপনি কেবল এটি পান id পরিগণিতের উপর ভিত্তি করে পদ্ধতিটির জন্য ধন্যবাদ পাবেন get

তাই:

  • আপনার যদি কেবলid 4 রেলগুলির দরকার হয় তবে ব্যবহার করুন ids:User.first.gifts.ids

  • আপনার যদি কেবল রেল 4 সহ কিছু ক্ষেত্রের প্রয়োজন হয় তবে ব্যবহার করুন pluck:User.first.gifts.pluck(:id, :name, ...)

  • আপনার কেবলমাত্র 3 টি রেল সহ একটি ক্ষেত্রের প্রয়োজন হলে , ব্যবহার করুন pluck:User.first.gifts.pluck(:id)

  • আপনার যদি সমস্ত ক্ষেত্রের প্রয়োজন হয় তবে ব্যবহার করুনcollect

  • আপনার যদি রেল 4 সহ কিছু ক্ষেত্রের প্রয়োজন হয় তবে এখনও ব্যবহার করুন pluck

  • আপনার যদি রেল 3 সহ কিছু ক্ষেত্রের প্রয়োজন হয়, selectএবং ব্যবহার করুনcollect


"আপনার যদি কিছু ক্ষেত্রের প্রয়োজন হয় তবে নির্বাচন করুন সংগ্রহ করুন" - আপনি কি pluckএকাধিক বৈশিষ্ট্য যেমন ব্যবহার করতে পারবেন না pluck(:id, :name)?
আলেকজান্ডার

@ অ্যালেক্সপোপোভ - 4++ pluckএকাধিক ক্ষেত্রগুলিকে রইল সমর্থন করে , 3 টি ব্যর্থ হয় না, যদি না আপনি রায়ান
লেফেভেরের কাজটি

3
4 রেলগুলিতে , আপনার যদি কেবলমাত্র প্রয়োজন হয় id, .idsরেফ ডকটি ব্যবহার করুন : api.rubyonrails.org/classes/ActtiveRecord/…
ইভান চৌ চৌ

30

হ্যাঁ. পাগল নির্দেশিকা অনুযায়ী , pluckসরাসরি একটি মধ্যে একটি ডাটাবেস ফলাফলের পরিবর্তন করে arrayনির্মাণের ছাড়াইActiveRecord বস্তু। এর অর্থ একটি বৃহত বা প্রায়শই চলমান ক্যোয়ারির জন্য আরও ভাল পারফরম্যান্স।

@ অ্যাপনেডাইভিংয়ের উত্তর ছাড়াও, pluckএকক এবং একাধিক কলামের নাম উভয়ই যুক্তি হিসাবে নিতে পারে:

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]

3

মূল এবং মূল পার্থক্যটি হ'ল প্লক ডিবি স্তরের উপর প্রয়োগ করে সমস্ত তথ্য সংগ্রহ করে সংগ্রহ করে তারপরে আপনার কাছে রেকর্ড ফিরিয়ে দেয় যখন আপনার সমস্ত রেকর্ড সংগ্রহের প্রয়োজন হয় এবং যখন কয়েকটি ক্ষেত্রের পরে প্লাক ব্যবহার করা হয়


2

আপনি যদি পুনরুদ্ধারকৃত রেকর্ডের কয়েকটি অ্যাট্রিবিউট ব্যবহার করছেন এমন কোনও ক্ষেত্রে যদি থাকে। এই ক্ষেত্রে আপনার ব্যবহার করা উচিত pluck

User.collect(&:email)

উপরের উদাহরণে আপনার যদি স্মৃতি এবং সময় নষ্ট না করে কেবল ইমেল বৈশিষ্ট্যের প্রয়োজন হয়। কারণ এটি ডাটাবেসে ব্যবহারকারী সারণী থেকে সমস্ত কলাম পুনরুদ্ধার করবে, প্রতিটি বৈশিষ্ট্যের জন্য মেমরি বরাদ্দ করে (যে বৈশিষ্ট্যগুলি আপনি কখনই ব্যবহার করবেন না)

দ্রষ্টব্য: pluckব্যবহারকারীর অ্যাক্টিভেকর্ড_ সম্পর্কিতটি ফেরত দেয় না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.