сфери застосування лямбда та аргументи в стилі Rails 4?


144

Мені цікаво, як робиться наступне в Rails 4 або якщо я просто використовую підхід Rails 3 для використання лямбда, який може передавати аргумент так само, як і 4.

Я досить новачок у Rails 3 і намагаюся працювати над деякими зразками, що працюють на Rails 4.

Ось мій код Rails 3:

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

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

Отже, якщо це спосіб Rails 4 - використовувати -> {}, це лямбда, правда? scope :all_lazy, -> { select("*") }Що робити, якщо мені знадобився аргумент. Я спробував кілька різних ідей і отримав помилки аргументу в консолі при використанні -> {}.

Відповіді:


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
Зауважте, що якщо ви використовуєте Ruby 1.9, короткий лямбда-синтаксис не дає пробілу між стрілкою та параметром ( scope :find_lazy, ->(param)). У Ruby 2+ доступний пробіл. Більше інформації тут ...
furman87

"Сучасний" синтекс у Рубіscope :find_lazy, -> id { where id: id }
меч

11

Рубі теж не застаріла в старому стилі лямбда, тож якщо вам зручніше, користуючись цим, будьте готові до цього.

Мені особисто не подобається синтаксис стійкої лямбда, але з часом вони, мабуть, стануть нормою, тому не завадить звикати до них.


6
Мені подобається синтаксис, але мені здається неправильним розміщувати аргументи між стрілкою та тілом функції, тоді як це повинно було бути "(id) -> {де ...}", що було б набагато привабливіше (і не було б ні перерва мої знання з математики та синтаксис coffeescript). Зрештою, "->" говорить щось на зразок відображення значень на результат.
hurikhan77

Я зіткнувся з ситуацією, коли використання старого стилю в Rails 4.2 повертало неправильні булеві значення з бази даних. Він може бути офіційно застарілим, але за допомогою оновленого синтаксису виправлена ​​проблема.
stevenspiel

1
@ hurikhan77 Так, сумнівно, що синтаксис конфліктує з CoffeeScript coffeescript.org/#functions
Хлоя,

8

Рейки 4, ви можете зробити:

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

Це було в старому рубіні:

:id => id

Краще хеш:

id: id

5

хлопець, я зазвичай використовував синтаксис програмування нижче

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

Але коли я переглядав свій код за допомогою Codacy, я виявив, що він попереджає мене про цей синтаксис

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.