lambda içeren kapsamlar ve Rails 4 stilindeki argümanlar?


145

Aşağıdakilerin Rails 4'te nasıl yapıldığını veya 3 ile yaptığım gibi 4 ile aynı şekilde bir argüman geçirebilen bir lambda kullanmak için sadece Rails 3 yaklaşımını kullanıp kullanmadığımı merak ediyorum.

Rails 3'te oldukça yeniyim ve Rails 4'ü çalıştıran bazı örnekler üzerinde çalışmaya çalışıyorum.

İşte Rails 3 kodum:

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

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

Yani bu Rails 4 ise -> {} kullanmak ise, bu bir lambda, değil mi? scope :all_lazy, -> { select("*") }Ya bir tartışmaya ihtiyacım olursa. -> {} kullanırken birkaç farklı fikir denedim ve konsolda argüman hataları alıyorum.

Yanıtlar:


307

Sanırım şöyle olmalı:

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

2
Destekleyici belgeler , bölüm 14.1 özellikle.
Dennis

3
Yaşasın, scope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
yazmama

5
Ruby 1.9 kullanıyorsanız, kısa lambda sözdiziminin ok ve parametre ( scope :find_lazy, ->(param)) arasında boşluğa izin vermediğini unutmayın . Ruby 2+ 'de boşluğa izin verilir. Daha fazla bilgi burada ...
furman87

Ruby'de "Modern" sözdizimiscope :find_lazy, -> id { where id: id }
swordray

11

Ruby de lambda'nın eski tarzını terk etmedi, bu yüzden onu kullanırken kendinizi daha rahat hissediyorsanız, kesinlikle deneyin.

Şahsen stabby lambda'nın sözdizimini kendim beğenmiyorum ama sonunda muhtemelen norm haline gelecekler, bu yüzden onlara alışmaktan zarar gelmez.


6
Sözdizimini seviyorum, ancak argümanları ok ve işlev gövdesi arasına yerleştirmek tamamen yanlış geliyor, oysa "(id) -> {nerede ...}" olması gerekirdi ki bu çok daha çekici olurdu (ve ikisi de matematik bilgimi ve kahve yazımı sözdizimini bozuyorum). Sonunda "->", değerleri bir sonuca eşlemek gibi bir şey söylüyor.
hurikhan77

Rails 4.2'de eski stili kullanmanın veritabanından yanlış boole değerleri döndürdüğü bir durumla karşılaştım. Resmi olarak kullanımdan kaldırılmamış olabilir, ancak güncellenmiş sözdizimini kullanmak sorunu çözdü.
stevenspiel

1
@ hurikhan77 Evet, sözdiziminin CoffeeScript coffeescript.org/#functions
Chloe

8

Rails 4, şunları yapabilirsiniz:

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

Bu eski yakuttaydı:

:id => id

Daha iyi karma:

id: id

5

adam genellikle aşağıdaki programlama söz dizimini kullanıyordum

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

Ancak kodumu Codacy kullanarak incelerken, bu sözdizimi hakkında beni uyardığını fark ettim

Use the `lambda` method for multiline lambdas.

Bunu olarak değiştirdim ve iyi çalışıyor

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

2

Dernekleri desteklemek için:

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

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

eşdeğerdir

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

Dayanarak raylar kılavuz üzerinde yakut :Using a class method is the preferred way to accept arguments for scopes.

Sınıf yöntemlerine tercih etmek için kapsamları lambdalarla birlikte kullanmak için bir neden yoktur. Kişisel bir tercih meselesidir. Ancak yönergeleri takip etmek istiyorsanız, bağımsız değişkenler söz konusu olduğunda sınıf yöntemini kullanmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.