लैम्ब्डा के साथ स्कोप और रेल 4 शैली में तर्क?


144

मैं सोच रहा हूं कि रेल 4 में निम्नलिखित कैसे किया जाता है या अगर मैं सिर्फ लैंबडा का उपयोग करने के लिए रेल 3 दृष्टिकोण का उपयोग करता हूं जो 4 के साथ एक तर्क को पारित कर सकता है जैसे मैं 3 के साथ करता हूं।

मैं रेल 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 तरीका है -> {} का उपयोग करने के लिए, यह एक लंबोदा है, है ना? scope :all_lazy, -> { select("*") }क्या होगा अगर मुझे एक तर्क की आवश्यकता है। मैंने कुछ अलग-अलग विचारों की कोशिश की और कंसोल में तर्क त्रुटियां प्राप्त कीं -> {} का उपयोग करते समय।

जवाबों:


305

मुझे लगता है कि यह होना चाहिए:

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

2
सहायक दस्तावेज , धारा 14.1 विशेष रूप से।
डेनिस

3
Yay, ने मुझे लिखने में मदद की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
ध्यान दें कि यदि आप रूबी 1.9 का उपयोग कर रहे हैं, तो छोटा लैम्ब्डा सिंटैक्स तीर और एक पैरामीटर ( scope :find_lazy, ->(param)) के बीच की जगह की अनुमति नहीं देता है । रूबी 2+ में, अंतरिक्ष की अनुमति है। अधिक जानकारी यहाँ ...
19

रूबी में "आधुनिक" scope :find_lazy, -> id { where id: id }
सिनटेक्स

11

रूबी ने लैंबडा की पुरानी शैली को भी नहीं चित्रित किया है, इसलिए यदि आप इसका उपयोग करके अधिक सहज महसूस करते हैं तो हर तरह से इसके लिए जाएं।

मैं व्यक्तिगत रूप से खुद को स्टैम्बी लैम्ब्डा के वाक्य-विन्यास को पसंद नहीं करता, लेकिन आखिरकार वे शायद आदर्श बन जाएंगे, ताकि उन्हें इसकी आदत न पड़े।


6
मुझे वाक्य-विन्यास पसंद है लेकिन तीर और फ़ंक्शन बॉडी के बीच की दलीलों को जगह देना आसान लगता है, जबकि यह होना चाहिए था "(आईडी) -> {जहां ...}" जो बहुत अधिक आकर्षक होगा (और न ही मेरे गणित के ज्ञान और न ही कॉफ़ीस्क्रिप्ट सिंटैक्स के साथ तोड़)। अंत में "->" एक परिणाम के लिए मान मानचित्रण की तरह कुछ कहता है।
हरिकिशन 7

मैं एक ऐसी स्थिति में भाग गया, जहां पुरानी शैली में रेल्स 4.2 का उपयोग डेटाबेस से गलत बूलियन मान लौटा रहा था। यह आधिकारिक तौर पर पदावनत नहीं हो सकता है, लेकिन अद्यतन सिंटैक्स का उपयोग करके समस्या को ठीक किया गया है।
स्टीवंसपिल

1
@ हर्किहन hur77 हाँ, यह इस बात को खारिज कर रहा है कि सिंटैक्स कॉफ़ी विद कॉफ़ी विद्या.ऑर्ग
च्लोए

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.

क्लास के तरीकों को वरीयता देने के लिए लैम्ब्डा के साथ एक साथ स्कोप का उपयोग करने का कोई कारण नहीं है। यह व्यक्तिगत पसंद की बात है। लेकिन, यदि आप दिशानिर्देशों का पालन करना चाहते हैं, तो आपको तर्क के शामिल होने पर कक्षा पद्धति का उपयोग करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.