বিশিষ্ট মান দ্বারা বস্তুর অ্যারে ফিল্টার করে রেল


98

সুতরাং আমি ডিবিতে একটি কোয়েরি করি এবং আমার কাছে সামগ্রীর একটি অ্যারে রয়েছে:

@attachments = Job.find(1).attachments

এখন যেহেতু আমার কাছে অবজেক্টগুলির একটি অ্যারে রয়েছে আমি অন্য ডিবি কোয়েরিটি সম্পাদন করতে চাই না, তবে আমি Attachmentঅবজেক্টটির উপর ভিত্তি করে অ্যারে ফিল্টার করতে চাই file_typeযাতে attachmentsফাইল টাইপটি কোথায় আছে তার একটি তালিকা 'logo'এবং তারপরে attachmentsযেখানে অন্য একটি তালিকা থাকতে পারে ফাইল টাইপ হয়'image'

এটার মতো কিছু:

@logos  = @attachments.where("file_type = ?", 'logo')
@images = @attachments.where("file_type = ?", 'image')

তবে ডিবি ক্যোয়ারির পরিবর্তে স্মৃতিতে।


উদাহরণস্বরূপpartition - এখানে ভাল ব্যবহারের ক্ষেত্রে মনে হয় ।
SRack

উত্তর:


174

চেষ্টা করুন:

্রফ :

@logos = @attachments.select { |attachment| attachment.file_type == 'logo' }
@images = @attachments.select { |attachment| attachment.file_type == 'image' }

তবে পারফরম্যান্স অনুযায়ী আপনার দু'বার @ সংযুক্তিকে পুনরাবৃত্তি করতে হবে না:

@logos , @images = [], []
@attachments.each do |attachment|
  @logos << attachment if attachment.file_type == 'logo'
  @images << attachment if attachment.file_type == 'image'
end

4
@ ভিক এর সমাধানটি বেশ আদর্শ হিসাবে, আমি কেবল এটি যুক্ত করব বাইনারি ক্ষেত্রে, আপনি জিনিসগুলিকে মিষ্টি করতে একটি 'পার্টিশন' ফাংশন ব্যবহার করতে পারেন। রুবি
ভ্লাদ

ধন্যবাদ @ ভ্ল্যাড, দারুণ লাগছে তবে এটি কেবল তখনই সমর্থন করে যদি আমাদের উদ্দেশ্য থেকে কেবল দুটি জিনিস সংগ্রহ করতে হয়।
ভিক

4
হ্যাঁ, তাই আমি "বাইনারি" :) বলেছিলাম। প্রশ্নটিতে লোগো বা চিত্রের স্পষ্টতই একটি পছন্দ ছিল, তাই আমি এটি সম্পূর্ণতার জন্য যুক্ত করেছি।
ভ্লাদ

8

যদি আপনার সংযুক্তি হয়

@attachments = Job.find(1).attachments

এটি সংযুক্তিগুলির বস্তুর অ্যারে হবে

ফাইল টাইপ উপর ভিত্তি করে ফিল্টার করতে নির্বাচন পদ্ধতি ব্যবহার করুন।

@logos = @attachments.select { |attachment| attachment.file_type == 'logo' }
@images = @attachments.select { |attachment| attachment.file_type == 'image' }

এটি কোনও ডিবি ক্যোয়ারিকে ট্রিগার করবে না।


2

আপনি কি আগ্রহী লোড চেষ্টা করেছেন?

@attachments = Job.includes(:attachments).find(1).attachments

দুঃখিত আমি পরিষ্কার করছি না: অ্যারের মাধ্যমে লুপ না করে আমি কীভাবে কোনও অবজেক্ট অ্যাট্রিবিউটর মান দ্বারা ফিল্টার করব?
জয়পুর

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি কম ডিবি ক্যোরিয়াম চান, বিশেষত একবার একবার যদি কোন @attachments = Job.first.attachmentsএক্সিকিউটড হয়ে থাকে @attachmentsতবে আপনি আর ডিবি কোয়েরি না চাইলে আপনি লুপ করতে চান। এই আপনি কি করতে চান?
সিউই শেন 申思维

আমি একটি ডিবি কোয়েরি করি এবং বস্তুর একটি অ্যারে পাই receive তারপরে আমি তার বৈশিষ্ট্যগুলির মূল্যের উপর ভিত্তি করে অবজেক্টগুলি ফিল্টার করে সেই অ্যারে থেকে দুটি পৃথক তালিকা তৈরি করতে চাই (মূল পোস্টটি দেখুন) - চিয়ার্স
জয়পুর


0

আমি এই সম্পর্কে কিছুটা ভিন্ন যেতে হবে। আপনার যা প্রয়োজন কেবল তা পুনরুদ্ধার করতে এবং সেখান থেকে বিভক্ত হওয়ার জন্য আপনার ক্যোয়ারিকে কাঠামো করুন।

সুতরাং আপনার জিজ্ঞাসাটি নিম্নলিখিত করুন:

#                                vv or Job.find(1) vv
attachments = Attachment.where(job_id: @job.id, file_type: ["logo", "image"])
# or 
Job.includes(:attachments).where(id: your_job_id, attachments: { file_type: ["logo", "image"] })

এবং তারপরে ডেটা পার্টিশন করুন:

@logos, @images = attachments.partition { |attachment| attachment.file_type == "logo" }

এটি আপনার পরিচ্ছন্ন এবং দক্ষ পদ্ধতিতে ডেটা পাবেন।

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