রেলস: একটি কলাম থেকে অনন্য মান নির্বাচন করুন


238

আমার ইতিমধ্যে একটি কার্যনির্বাহী সমাধান রয়েছে তবে আমি কেন সত্যিই এটি কাজ করে না তা জানতে চাই:

ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }

এটি নির্বাচন করে, তবে অনন্য মানগুলি মুদ্রণ করে না, এটি সদৃশ সহ সমস্ত মান মুদ্রণ করে। এবং এটি ডকুমেন্টেশনে রয়েছে: http://guides.rubyonrails.org/active_record_querying.html#seseteing-specific- Fields


2
Uniq সঙ্গে আরেকটি উদাহরণ stackoverflow.com/questions/8369812/...
মনীশ nautiyal

উত্তর:


449
Model.select(:rating)

এর ফলাফল হ'ল Modelবস্তুগুলির সংগ্রহ । সরল রেটিং নয়। এবং uniqদৃষ্টিকোণ থেকে , তারা সম্পূর্ণ আলাদা। আপনি এটি ব্যবহার করতে পারেন:

Model.select(:rating).map(&:rating).uniq

বা এটি (সবচেয়ে দক্ষ)

Model.uniq.pluck(:rating)

# rails 5+
Model.distinct.pluck(:rating)

হালনাগাদ

স্পষ্টতই, রেল 5.0.0.1 হিসাবে, এটি কেবল উপরের মত "শীর্ষ স্তরের" অনুসন্ধানগুলিতে কাজ করে। সংগ্রহ প্রক্সিগুলিতে কাজ করে না (উদাহরণস্বরূপ "has_many" সম্পর্ক)।

Address.distinct.pluck(:city) # => ['Moscow']
user.addresses.distinct.pluck(:city) # => ['Moscow', 'Moscow', 'Moscow']

এক্ষেত্রে ক্যোয়ারির পরে নকল করুন

user.addresses.pluck(:city).uniq # => ['Moscow']

আমি একটি করেছি: গোষ্ঠী (: রেটিং) c নির্বাচন করুন r | r | আর.রেটিং} যেহেতু মানচিত্র == সংগ্রহ করুন, আপনার ব্যবহৃত সিনট্যাক্স সম্পর্কে আমি কোথায় পড়তে পারি (&: রেটিং)? আমি এটি রুবির ডকুমেন্টেশনে দেখছি না।
আলেকজান্দ্রিকোস্তা

@ ব্যবহারকারী 1261084:। ম্যাপ (&: রেটিং) বুঝতে সিম্বলটি # টু_প্রোক দেখুন । প্রাগডেভ ব্যাখ্যা করেছেন
dbenhur

63
এটি Model.uniq.pluck(:rating)করার সর্বাধিক দক্ষ উপায় এটি লক্ষণীয় worth এটি এসকিউএল উত্পন্ন করে যা অ্যারেতে SELECT DISTINCTআবেদন .uniqকরার চেয়ে ব্যবহার করে
মিকি

23
5 Model.uniq.pluck(:rating)Model.distinct.pluck(:rating)
রেলগুলিতে

2
যদি আপনি has_many সম্পর্ক থেকে অনন্য মান নির্বাচন করতে চান আপনি সর্বদা করতে পারেনModel.related_records.group(:some_column).pluck(:some_column)
Krzysztof Karski

92

আপনি যদি ব্যবহার করতে যাচ্ছেন Model.select, তবে আপনি কেবলমাত্র ব্যবহার করতে পারেন DISTINCT, কারণ এটি কেবল অনন্য মানগুলিকেই ফিরিয়ে দেবে। এটি আরও ভাল কারণ এর অর্থ এটি কম সারিগুলি দেয় এবং বেশ কয়েকটি সারি ফেরত দেওয়ার পরে এবং তারপরে অনন্য মানগুলি বেছে নেওয়ার জন্য বলার চেয়ে কিছুটা দ্রুত হওয়া উচিত।

Model.select('DISTINCT rating')

অবশ্যই এটি আপনার ডেটাবেসটি মূলশব্দটি বোঝে DISTINCTএবং সবচেয়ে বেশি হওয়া উচিত।


6
Model.select("DISTINCT rating").map(&:rating)মাত্র রেটিংগুলির একটি অ্যারে পেতে।
ক্রিস

উত্তেজনাপূর্ণ অ্যাপ্লিকেশনগুলি রেল ২.৩ ব্যবহার করে তাদের জন্য দুর্দান্ত
মিকি

3
হ্যাঁ..এটি দুর্দান্ত কাজ করে - তবে এটি কেবলমাত্র DISTINCT এর বৈশিষ্ট্য দেয়। আপনি কীভাবে পুরো মডেল অবজেক্টটিকে তার স্বতন্ত্র হিসাবে দীর্ঘ করতে পারবেন? যাতে বৈশিষ্ট্যটি অনন্য, এমন উদাহরণগুলিতে আপনি মডেলটিতে সমস্ত বৈশিষ্ট্যের অ্যাক্সেস পাবেন।
শূন্য_কুল

@ জ্যাকসন_স্যান্ডল্যান্ড যদি আপনি কোনও মডেল অবজেক্ট চান তবে সারণীর কোনও রেকর্ড থেকে তা ইনস্ট্যান্ট করা দরকার। তবে আপনি কেবল একটি অনন্য মান (একাধিক রেকর্ড হতে পারে) থেকে রেকর্ড নির্বাচন করছেন না।
বেনিসিমো

69

এটিও কাজ করে।

Model.pluck("DISTINCT rating")

আমি বিশ্বাস করি প্লাক রুবি ১.৯.x এবং তার বেশি। পূর্ববর্তী সংস্করণ ব্যবহার করে এমন কারও কাছে এটি থাকবে না। আপনি যদি 1.9x বা তার উপরে থাকেন তবে রুবি ডকস এটিও কাজ করে বলে: Model.uniq.pluck (: রেটিং)
কাকুবেই

6
pluckএকটি বিশুদ্ধ পাগল> 3.2 পদ্ধতি যা রুবি কোন নির্ভরতা রয়েছে 1.9.x তা দেখুন apidock.com/rails/v3.2.1/ActiveRecord/Calculations/pluck
ড্যানিয়েল Rikowski

34

আপনি যদি অতিরিক্ত ক্ষেত্রগুলিও চয়ন করতে চান:

Model.select('DISTINCT ON (models.ratings) models.ratings, models.id').map { |m| [m.id, m.ratings] }

1
select extra fields<3 <3
cappie013

27
Model.uniq.pluck(:rating)

# SELECT DISTINCT "models"."rating" FROM "models"

এটিতে স্কয়ার স্ট্রিং ব্যবহার না করার এবং মডেলগুলি ইনস্ট্যান্ট না করার সুবিধা রয়েছে


3
এটি রেল 5.1 / এআর 5.1 => অপরিবর্তিত পদ্ধতি `ইউনিট'-এর সাথে ত্রুটি ছুঁড়ে ফেলেছে
গ্রাহাম স্লিক

24
Model.select(:rating).uniq

এই কোডটি 3.2 রেল থেকে 'DISTINCT' (অ্যারে # ইউনিট হিসাবে নয়) হিসাবে কাজ করে


5
Model.select(:rating).distinct

2
এটি একমাত্র সরকারীভাবে সঠিক উত্তর যা অত্যন্ত দক্ষ। যদিও, .pluck(:rating)শেষে যুক্ত করা ওপি যা চেয়েছিল তা ঠিক করে দেবে।
শেহিয়ার

5

যদি আমি তখন ঠিক পথে যাচ্ছি:

বর্তমান জিজ্ঞাসা

Model.select(:rating)

অবজেক্টের অ্যারে ফিরিয়ে দিচ্ছে এবং আপনার কাছে কোয়েরি রয়েছে

Model.select(:rating).uniq

ইউনিট অবজেক্টের অ্যারেতে প্রয়োগ করা হয় এবং প্রতিটি বস্তুর স্বতন্ত্র আইডি থাকে। ইউনিক সঠিকভাবে এটি সম্পাদন করছে কারণ অ্যারেতে থাকা প্রতিটি বস্তু ইউনিক হয়।

স্বতন্ত্র রেটিং নির্বাচনের অনেকগুলি উপায় রয়েছে:

Model.select('distinct rating').map(&:rating)

অথবা

Model.select('distinct rating').collect(&:rating)

অথবা

Model.select(:rating).map(&:rating).uniq

অথবা

Model.select(:name).collect(&:rating).uniq

আরও একটি জিনিস, প্রথম এবং দ্বিতীয় ক্যোয়ারী: এসকিউএল কোয়েরি দ্বারা স্বতন্ত্র ডেটা সন্ধান করুন।

এই প্রশ্নগুলি "লন্ডন" এবং "লন্ডন" হিসাবে বিবেচিত হবে একই অর্থ এটি স্থানের প্রতি অবহেলা করবে, এ কারণেই এটি আপনার প্রশ্নের ফলাফলের জন্য একবার 'লন্ডন' নির্বাচন করবে।

তৃতীয় এবং পরবর্তী ক্যোয়ারী:

এসকিউএল কোয়েরি দ্বারা ডেটা সন্ধান করুন এবং স্বতন্ত্র ডেটা প্রয়োগের জন্য রুবি ইউনিক মেহটড প্রয়োগ করুন। এই প্রশ্নগুলি "লন্ডন" এবং "লন্ডন" কে আলাদা বিবেচনা করবে, এ কারণেই এটি আপনার ক্যোয়ারী ফলাফলে 'লন্ডন' এবং 'লন্ডন' উভয়ই বেছে নেবে।

দয়া করে আরও বোঝার জন্য সংযুক্ত চিত্রটিকে পছন্দ করুন এবং "স্পর্শকৃত / প্রত্যাশিত আরএফপি" দেখুন on

এখানে চিত্র বর্ণনা লিখুন


6
mapএবং collectএকই পদ্ধতির জন্য উপকরণ, উভয়ের জন্য উদাহরণ দেওয়ার দরকার নেই।
অ্যাডাম লাসেক

4

কিছু উত্তর বিবেচনায় নেয় না ওপি মানগুলির একটি অ্যারে চায়

যদি আপনার মডেলটিতে কয়েক হাজার রেকর্ড থাকে তবে অন্যান্য উত্তরগুলি ভাল কাজ করে না

এটি বলেছিল, আমি মনে করি একটি ভাল উত্তর হ'ল:

    Model.uniq.select(:ratings).map(&:ratings)
    => "SELECT DISTINCT ratings FROM `models` " 

কারণ, প্রথমে আপনি মডেলের একটি অ্যারে তৈরি করেন (নির্বাচনের কারণে হ্রাসযুক্ত আকারের সাথে), তারপরে আপনি নির্বাচিত মডেলগুলির কেবলমাত্র বৈশিষ্ট্যটি বের করেন (রেটিং)


3

যদি কেউ মঙ্গয়েডের সাথে একই সন্ধান করে তবে তা

Model.distinct(:rating)

এটি এখন কাজ করে না, এটি এখন বহুগুণ দেয়।
EUPHORAY

স্বতন্ত্রতা ফিরে আসে না
ডওই

2

বর্গক্ষেত্রের সাথে ইউনিক কলামগুলি সংগ্রহ করার আরেকটি উপায়:

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