lingkup dengan lambda dan argumen dalam gaya Rails 4?

144

Saya bertanya-tanya bagaimana hal berikut ini dilakukan di Rails 4 atau jika saya hanya menggunakan pendekatan Rails 3 untuk menggunakan lambda yang dapat memberikan argumen dengan cara yang sama dengan 4 seperti yang saya lakukan dengan 3.

Saya cukup baru untuk Rails 3 dan mencoba untuk mengerjakan beberapa sampel menjalankan Rails 4.

Ini kode Rails 3 saya:

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

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

Jadi jika ini adalah cara Rails 4 adalah dengan menggunakan -> {}, itu lambda, kan? scope :all_lazy, -> { select("*") }Bagaimana jika saya membutuhkan argumen. Saya mencoba beberapa ide berbeda dan mendapatkan kesalahan argumen di konsol saat menggunakan -> {}.

kaplan
sumber

Jawaban:

305

Saya pikir seharusnya:

scope :find_lazy, -> (id) { where(id: id) }
lis2
sumber
2
Dokumentasi pendukung , bagian 14.1 secara khusus.
Dennis
3
Yay, membantu saya menulisscope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
Epigene
4
Perhatikan bahwa jika Anda menggunakan Ruby 1.9, sintaks lambda pendek tidak memungkinkan spasi antara panah dan parameter ( scope :find_lazy, ->(param)). Di Ruby 2+, ruang diizinkan. Info lebih lanjut di sini ...
furman87
Sintaks "modern" di Rubyscope :find_lazy, -> id { where id: id }
swordray
11

Ruby juga tidak meninggalkan gaya lambda yang lama, jadi jika Anda merasa lebih nyaman menggunakannya, silakan saja.

Secara pribadi saya tidak suka sintaks lambda yang stabby tetapi akhirnya mereka mungkin akan menjadi norma sehingga tidak ada salahnya untuk membiasakan diri dengan mereka.

Branden Silva
sumber
6
Saya suka sintaksis tetapi rasanya salah untuk menempatkan argumen antara panah dan fungsi tubuh, sementara seharusnya "(id) -> {where ...}" yang akan jauh lebih menarik (dan tidak akan putus dengan pengetahuan matematika saya atau sintaksis coffeescript). Pada akhirnya "->" mengatakan sesuatu seperti memetakan nilai ke suatu hasil.
hurikhan77
Saya mengalami situasi di mana menggunakan gaya lama di Rails 4.2 mengembalikan nilai boolean yang salah dari database. Ini mungkin tidak secara resmi ditinggalkan, tetapi menggunakan sintaks yang diperbarui memperbaiki masalah.
stevenspiel
1
@ hurikhan77 Ya itu membingungkan bahwa sintaksis konflik dengan CoffeeScript coffeescript.org/#functions
Chloe
8

Rails 4, Anda dapat melakukan:

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

Itu ada di batu delima tua:

:id => id

Hash yang lebih baik:

id: id
sesperanto
sumber
5

cowok saya biasanya menggunakan sintaks pemrograman di bawah ini

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

Tetapi ketika saya meninjau kode saya menggunakan Codacy saya menemukan itu mengingatkan saya tentang sintaks ini

Use the `lambda` method for multiline lambdas.

Saya mengubahnya menjadi dan berfungsi dengan baik

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

Untuk mendukung asosiasi:

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

setara dengan

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

Berdasarkan pedoman ruby ​​on rails :Using a class method is the preferred way to accept arguments for scopes.

Tidak ada alasan untuk menggunakan cakupan bersama dengan lambdas sebagai pilihan metode kelas. Ini adalah masalah pilihan pribadi. Tetapi, jika Anda ingin mengikuti panduan, Anda harus menggunakan metode kelas saat argumen terlibat.

mmsilviu
sumber