phạm vi với lambda và đối số trong phong cách Rails 4?


144

Tôi đang tự hỏi làm thế nào sau đây được thực hiện trong Rails 4 hoặc nếu tôi chỉ sử dụng phương pháp Rails 3 để sử dụng lambda có thể vượt qua một đối số theo cách tương tự với 4 như tôi làm với 3.

Tôi khá mới với Rails 3 và đang cố gắng thực hiện một số mẫu chạy Rails 4.

Đây là mã Rails 3 của tôi:

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

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

Vì vậy, nếu đây là cách Rails 4 là sử dụng -> {}, thì đó là lambda, phải không? scope :all_lazy, -> { select("*") }Điều gì xảy ra nếu tôi cần một cuộc tranh luận. Tôi đã thử một vài ý tưởng khác nhau và nhận được lỗi đối số trong bảng điều khiển khi sử dụng -> {}.

Câu trả lời:


305

Tôi nghĩ nó nên như vậy:

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

2
Tài liệu hỗ trợ , phần 14.1 cụ thể.
Dennis

3
Yay, đã giúp tôi viếtscope :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/03/2015

4
Lưu ý rằng nếu bạn đang sử dụng Ruby 1.9, cú pháp lambda ngắn không cho phép khoảng trắng giữa mũi tên và tham số ( scope :find_lazy, ->(param)). Trong Ruby 2+, không gian được cho phép. Thêm thông tin ở đây ...
furman87

scope :find_lazy, -> id { where id: id }
Cú pháp

11

Ruby cũng không từ chối phong cách cũ của lambda, vì vậy nếu bạn cảm thấy thoải mái hơn khi sử dụng nó thì hãy dùng nó.

Bản thân tôi không thích cú pháp của lambda cứng nhắc nhưng cuối cùng họ có thể sẽ trở thành chuẩn mực để không quen với việc đó.


6
Tôi thích cú pháp nhưng cảm thấy sai khi đặt các đối số giữa mũi tên và thân hàm, trong khi nó phải là "(id) -> {where ...}" sẽ hấp dẫn hơn nhiều (và sẽ không hấp dẫn hơn phá vỡ kiến ​​thức toán học của tôi cũng như cú pháp coffeescript). Cuối cùng, "->" nói một cái gì đó giống như ánh xạ các giá trị vào kết quả.
Hurikhan77

Tôi gặp phải tình huống sử dụng kiểu cũ trong Rails 4.2 đang trả về các giá trị boolean không chính xác từ cơ sở dữ liệu. Nó có thể không được phản đối chính thức, nhưng sử dụng cú pháp cập nhật đã khắc phục vấn đề.
stevenspiel

1
@ Hurikhan77 Vâng, thật khó tin khi cú pháp mâu thuẫn với CoffeeScript coffeescript.org/#fifts
Chloe

8

Rails 4, bạn có thể làm:

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

Đó là trong viên ruby ​​cũ:

:id => id

Băm tốt hơn:

id: id

5

Tôi thường sử dụng cú pháp lập trình dưới đây

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

Nhưng khi tôi đang xem lại mã của mình bằng Codacy, tôi thấy nó cảnh báo tôi về cú pháp này

Use the `lambda` method for multiline lambdas.

Tôi đã thay đổi nó và nó hoạt động tốt

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

2

Để hỗ trợ các hiệp hội:

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

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

tương đương với

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

Dựa trên ruby trên đường ray hướng dẫn :Using a class method is the preferred way to accept arguments for scopes.

Không có lý do để sử dụng phạm vi cùng với lambdas theo sở thích đối với các phương thức lớp. Đó là một vấn đề sở thích cá nhân. Nhưng, nếu bạn muốn làm theo hướng dẫn, bạn nên sử dụng phương thức lớp khi có các đối số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.