ল্যাম্বদা সহ স্কেলগুলি এবং রেলস 4 স্টাইলে যুক্তিগুলি


144

আমি ভাবছি যে কীভাবে 4 রেলগুলিতে নিম্নলিখিতটি করা হয় বা যদি আমি কেবল ল্যাম্বডা ব্যবহারের জন্য রেল 3 পদ্ধতির ব্যবহার করি যা 3 এর সাথে 4 এর মত একইভাবে একটি যুক্তি পাস করতে পারে।

আমি রেল 3 তে বেশ নতুন এবং রেল 4 চালা কিছু নমুনার মাধ্যমে কাজ করার চেষ্টা করছি।

এখানে আমার রেলগুলি 3 কোড:

class Person < ActiveRecord::Base
  scope :find_lazy, lambda {|id| where(:id => id)}
end

# In console I can call
Person.find_lazy(1)

সুতরাং যদি এই রেলস 4 উপায়টি হয় -> {use ব্যবহার করা হয় তবে এটি ল্যাম্বডা, তাই না? scope :all_lazy, -> { select("*") }আমার যদি কোন যুক্তির দরকার হয়। আমি -> {using ব্যবহার করার সময় কয়েকটি ভিন্ন ধারণার চেষ্টা করেছি এবং কনসোলটিতে যুক্তি ত্রুটি পেয়েছি}

উত্তর:


305

আমি মনে করি এটি:

scope :find_lazy, -> (id) { where(id: id) }

2
সহায়ক ডকুমেন্টেশন , বিভাগ 14.1 বিশেষভাবে।
ডেনিস

3
হ্যাঁ, আমাকে লিখতে সহায়তা করেছেনscope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
এপিজিন

4
মনে রাখবেন যে আপনি রুবি ১.৯ ব্যবহার করছেন যদি সংক্ষিপ্ত ল্যাম্বদা সিনট্যাক্স তীর এবং প্যারামিটার ( scope :find_lazy, ->(param)) এর মধ্যে কোনও স্থানের অনুমতি দেয় না । রুবি 2+ এ স্থানের অনুমতি রয়েছে। এখানে আরও তথ্য ...
ফারম্যান 87

রুবিতে "আধুনিক" সিনটেক্সscope :find_lazy, -> id { where id: id }
তরোয়াল

11

রুবি লাম্বদার পুরানো স্টাইলটিকেও হ্রাস করেনি, তাই যদি আপনি এটি ব্যবহার করে আরও স্বাচ্ছন্দ্য বোধ করেন তবে এটির জন্য যান।

আমি ব্যক্তিগতভাবে ছুরিকাঘাতে ল্যাম্বদার সিনট্যাক্সটি পছন্দ করি না তবে অবশেষে তারা সম্ভবত আদর্শ হয়ে উঠবে যাতে এটি ব্যবহারে ক্ষতি হয় না।


6
আমি বাক্য গঠনটি পছন্দ করি তবে তীর এবং ফাংশন বডির মধ্যে তর্কগুলি যুক্ত করা স্পষ্টতই ভুল বলে মনে হয়, যদিও এটি "(আইডি) -> {যেখানে ...}" হওয়া উচিত ছিল যা আরও বেশি আবেদনময়ী হবে (এবং কোনওটিই হবে না) আমার গণিত জ্ঞান বা coffeescript সিনট্যাক্স সঙ্গে বিরতি)। শেষে "->" কোনও ফলাফলকে মানচিত্রের মতো কিছু বলে।
হুরিখান 77

আমি এমন পরিস্থিতিতে ছুঁড়েছি যেখানে ails.২ রাইলে পুরানো স্টাইলটি ব্যবহার করে ডাটাবেস থেকে ভুল বুলিয়ান মানগুলি ফিরে আসছিল। এটি আনুষ্ঠানিকভাবে অবহেলিত হতে পারে না, তবে আপডেট করা সিনট্যাক্স ব্যবহার করে সমস্যার সমাধান করেছে।
স্টিভেনস্পিল

1
@ হুরিকান Y77 হ্যাঁ এটি বিস্মৃত হয়েছে যে সিনফ্যাক্সটি
ক্লো

8

4 রেল, আপনি করতে পারেন:

scope :find_lazy, -> (id) { where(id: id) }

এটি ছিল পুরানো রুবিতে:

:id => id

ভাল হ্যাশ:

id: id

5

লোক আমি সাধারণত নীচের প্রোগ্রামিং বাক্য গঠন ব্যবহার করছিলাম

scope :find_lazy, -> (id) { where(id: id) }

কিন্তু যখন আমি কোডেস ব্যবহার করে আমার কোডটি পর্যালোচনা করছিলাম তখন আমি এটি আমার এই বাক্য গঠন সম্পর্কে সতর্ক করেছিলাম

Use the `lambda` method for multiline lambdas.

আমি এটিকে পরিবর্তিত করেছি এবং এটি ভালভাবে কাজ করছে

  scope :find_lazy, lambda {|id|
    where(id: id)
  }

2

সমিতিগুলি সমর্থন করার জন্য:

scope :find_lazy, -> (object) { where(object_id: object.id) }

1
scope :find_lazy, -> (id) { where(id: id) }

সমতুল্য

self.find_lazy(id)
  where(id: id)
end

রেল গাইডের উপর রুবির উপর ভিত্তি করে :Using a class method is the preferred way to accept arguments for scopes.

শ্রেণিবিন্যাসের পছন্দগুলিতে ল্যাম্বডাসের সাথে স্কোপগুলি একসাথে ব্যবহার করার কোনও কারণ নেই। এটি ব্যক্তিগত পছন্দের বিষয়। তবে, আপনি যদি গাইডলাইনগুলি অনুসরণ করতে চান, যুক্তি জড়িত থাকার সময় আপনার ক্লাস পদ্ধতিটি ব্যবহার করা উচিত।

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