রেলপথে স্কোপ / নাম_স্কোপ কী?


105

আমি সম্প্রতি ইন্টার্নশিপ শুরু করেছি। আমার নিয়োগকর্তা রেলপথে রুবি ব্যবহার করেন এবং আমি প্রায়শই নতুন সিনট্যাক্সের মুখোমুখি হই যা বুঝতে আমার প্রয়োজন হয়। নাম_স্কোপের একটি ভাল ব্যাখ্যার জন্য আমি প্রায় গুগল করেছি, তবে এখন পর্যন্ত যা আমি পেয়েছি তা বেশিরভাগ ব্লগ পোস্টই এর প্রশংসা করছে, বরং একটি সরল সংজ্ঞা বা ভূমিকা introduction

রেলপথে রুবিতে নাম_স্কোপ (এখন কেবলমাত্র স্কোপ বলা হয়) ঠিক কী?



2
নামযুক্ত স্কোপগুলি শিখতে গিয়ে এই ব্লগ পোস্টটি আমার কাছে অমূল্য ছিল: ryandaigle.com/articles/2008/8/20/…
পিটার ব্রাউন

@ নোটপ্যাচ লিঙ্কটি মারা গেছে আপনার কি অন্য একটি আছে?
এমবিগ্রাস

রায়ান Daigle: নামযুক্ত ব্যাপ্তি: এটা শুধু শর্তাবলী, ইয়া জানা ?: জন্য নয় web.archive.org/web/20160306110506/http://...
notapatch

উত্তর:


212

একটি সুযোগ একটি সংগ্রহের একটি উপসেট। জটিল মনে হচ্ছে? এটা না। এটি কল্পনা করুন:

আপনার ব্যবহারকারী আছে। এখন, সেই ব্যবহারকারীদের মধ্যে কয়েকজন আপনার নিউজলেটারে সদস্যতা নিয়েছে। আপনি ব্যবহারকারীদের ডাটাবেসে একটি ক্ষেত্র যুক্ত করে (নিউজলেটার (ইউজার। সাবস্ক্রাইবড_ টু নিউজলেটার = সত্য) যোগ করে যারা নিউজলেটার পেয়েছেন তাদের চিহ্নিত করেছেন। স্বাভাবিকভাবেই, আপনি কখনও কখনও সেই ব্যবহারকারীদের পেতে চান যারা আপনার নিউজলেটারে সদস্যতা নিয়েছে।

আপনি, অবশ্যই, সর্বদা এটি করতে পারেন:

User.where(subscribed_to_newsletter: true).each do #something

আপনি সবসময় এটি লেখার পরিবর্তে, তবে এর মতো কিছু করতে পারেন।

#File: users.rb
class User < ActiveRecord::Base
  scope :newsletter, where(subscribed_to_newsletter: true)
  #yada yada
end

আপনি যদি 4 টি বা তার বেশি বা বেশি ব্যবহার করছেন তবে পরিবর্তে এটি করুন:

#File: users.rb
class User < ActiveRecord::Base
  scope :newsletter, -> { where(subscribed_to_newsletter: true) }
  #yada yada
end

এটি আপনাকে কেবল এটি করে আপনার গ্রাহকদের অ্যাক্সেস করতে দেয়:

User.newsletter.each do #something

এটি খুব সাধারণ উদাহরণ তবে সাধারণভাবে আপনার কাজকে সহজ করার জন্য স্কোপগুলি খুব শক্তিশালী সরঞ্জাম হতে পারে।

এই লিঙ্কটি দেখুন: এপিআই বর্ণনা


7
'সাবস্ক্রাইবড ইউজারস' নামক ইউজার ক্লাসে কোন পদ্ধতি নির্ধারণ করার পরিবর্তে এর কী কী সুবিধা বলতে পারি? যথা, 'Def self.subscribedUsers self.where (: subscribed_to_newsletter => সত্য) শেষ
redroot

3
@ রিড্রোট সুবিধাটি হ'ল scopeবাক্য গঠনটি অনেকটা পরিষ্কার, আপনি একই ফলাফল পাবেন তবে কেবল একটি লাইন দিয়ে
এলডো 'xoen' গিয়ামেলুকা

9
@ রেড্রুট এখানে একটি বৃহত দক্ষতার সুবিধা ছিল, কারণ স্কোপগুলি অলসভাবে ডাটাবেসটিকে জিজ্ঞাসা করত যখন পদ্ধতিগুলি আগ্রহের সাথে এটি করত। 3 রেলগুলিতে, পদ্ধতিগুলি খুব অলস হয়ে গেছে, সুতরাং এখন পার্থক্যটি আরও সিনট্যাকটিক। উত্স
evanrmurphy

এপিআই ডক লিঙ্কটি নষ্ট হয়ে গেছে দয়া করে api.rubyonrails.org/class/ActiveRecord/Scoping/Name/…
লোহিত এমভি

এছাড়াও
স্কোপযুক্ত

34

সক্রিয় রেকর্ডে সুযোগ শ্রেণি পদ্ধতির মতো তবে তারা রিলেশন অবজেক্টটি ফেরত দেয় যার অর্থ আপনি এটিতে অন্য কোনও স্কোপ বা সক্রিয় রেকর্ড অনুসন্ধান পদ্ধতি কল করতে পারেন।

উদাহরণস্বরূপ, যদি আপনার নীচে উল্লিখিত স্কোপ পদ্ধতিগুলির সাথে একটি জুম্বো মডেল (জম্বি টেবিল) থাকে,

class Zombie
  scope :rotting, -> { where(rotting: true) }
  scope :fresh, -> { where('age < ?', 25) }
  scope :recent, -> { order(created_at: :desc) }
end

এবং আপনি কল

Zombie.rotting.fresh.recent.limit(3)

এটি এসকিউএল এর নীচে অনুবাদ করে,

select "zombies.*" from "zombies" where "zombies"."rotting" = 't' and (age<20) order by create_at desc limit 3

উপরের উদাহরণটি রেল 4 সিনট্যাক্সের উপর ভিত্তি করে


আমি কোনও ডকুমেন্টেশনে অর্ডার (: made_at,: desc) এর উদাহরণ খুঁজে পাচ্ছি না। এটা কি আপনি বোঝানো সম্ভব scope :recent, -> { order(created_at: :desc) }? apidock.com/rails/v4.2.9/ActtiveRecord/QueryMethods/order
নোটপ্যাচ

7

বিশদ সম্পর্কে বোঝার সর্বোত্তম উপায় হ'ল এপিআই ডকুমেন্টেশনে যাওয়া।

আপনি সম্পূর্ণ বিশদ এবং আমরা স্কোপগুলি কীভাবে ব্যবহার করতে পারি সেগুলি পাবেন।

সুযোগের এপিআই ডকুমেন্টেশন


7

স্কোপগুলি ক্লাস পদ্ধতি ছাড়া কিছুই নয়।

কেন তাদের ব্যবহার?

স্কোপিং আপনাকে সাধারণত-ব্যবহৃত প্রশ্নগুলি নির্দিষ্ট করতে দেয় (এটি দীর্ঘ বা প্রায়শই ব্যবহৃত প্রশ্নের জন্য একটি শর্টকাট হিসাবে বিবেচনা করা যেতে পারে) যা সমিতির বিষয়গুলি বা মডেলগুলিতে মেথড কল হিসাবে উল্লেখ করা যেতে পারে। এই স্কোপগুলির সাহায্যে আপনি পূর্বে আচ্ছাদিত প্রতিটি পদ্ধতি যেমন কোথায়, যোগদান এবং অন্তর্ভুক্ত রয়েছে তা ব্যবহার করতে পারেন। সমস্ত স্কোপ পদ্ধতি একটি অ্যাক্টিভেকর্ড :: রিলেশন অবজেক্টটি ফিরিয়ে দেবে যা এটির জন্য আরও পদ্ধতিগুলির (যেমন অন্যান্য স্কোপগুলি) কল করার অনুমতি দেয়।

একটি সাধারণ স্কোপ সংজ্ঞায়িত করার জন্য, আমরা ক্লাসের অভ্যন্তরে স্কোপ পদ্ধতিটি ব্যবহার করি, যখন এই সুযোগটি বলা হয় তখন আমরা যে ক্যোয়ারীটি চালাতে চাই তা পাস করে:

class Article < ActiveRecord::Base
  scope :published, -> { where(published: true) }
end

এটি একটি শ্রেণিবদ্ধের পদ্ধতি নির্ধারণ করার মতো এবং এটি আপনি ব্যক্তিগত পছন্দ হিসাবে বিবেচনা করুন:

class Article < ActiveRecord::Base
  def self.published
    where(published: true)
  end
end

উদাহরণ সহ পুরো বিবরণের জন্য দয়া করে নীচের লিঙ্কটি অনুসরণ করুন। আমি আশা করি এটা তোমাকে সাহায্য করবে।

http://guides.rubyonrails.org/active_record_querying.html


3
এটি কোনও শ্রেণি পদ্ধতি নির্ধারণ করার মতো নয় । শ্রেণি পদ্ধতিগুলি nilকয়েকটি ক্ষেত্রে ফিরে আসে , এবং নির্দিষ্ট শর্তগুলির জন্য এইভাবে শৃঙ্খলাবদ্ধ নয়।
আরসলান আলী

1
  • কল্পনা করুন আপনার কাছে একটি মডেল রয়েছে: ব্যক্তি

এখন আপনি কল্পনা করুন:

  • বিশ্বের সমস্ত লোকেদের চুলের চুল চাই।
  • বিশ্বের সকল মানুষ যারা ক্রিকেট খেলেন তাদেরই চাই

আপনি সুযোগ ব্যবহার করে সেই বিশেষ শ্রেণীর লোকদের পেতে পারেন!

Person.red_hair.cricket ## finds all people with red hair who play cricket
Person.red_hair ## finds all people with red hair
Person.cricket ## finds all people who play cricket.

এখন যে এত কঠিন ছিল না?

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