Области с лямбда и аргументы в стиле Rails 4?

144

Мне интересно, как это делается в Rails 4 или я просто использую подход Rails 3 для использования лямбда-выражения, которое может передавать аргумент таким же образом с 4, как и с 3.

Я довольно новичок в 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) }
LIS2
источник
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) }
Epigene
4
Обратите внимание, что если вы используете Ruby 1.9, короткий лямбда-синтаксис не допускает пробела между стрелкой и параметром ( scope :find_lazy, ->(param)). В Ruby 2+ пробел разрешен. Больше информации здесь ...
furman87
«Современный» синтаксис в Rubyscope :find_lazy, -> id { where id: id }
фехтование
11

Ruby также не устарел в старом стиле лямбды, так что если вы чувствуете себя более комфортно, используйте его во что бы то ни стало.

Мне лично не нравится синтаксис «лямбда-лабиринта», но в итоге они, вероятно, станут нормой, так что не повредит им привыкнуть.

Бранден Сильва
источник
6
Мне нравится синтаксис, но кажется неправильным помещать аргументы между стрелкой и телом функции, хотя это должно было быть "(id) -> {where ...}", что было бы гораздо более привлекательным (и не порвать с моим знанием математики, ни синтаксиса coffeescript). В конце «->» говорит что-то вроде отображения значений на результат.
hurikhan77
Я столкнулся с ситуацией, когда использование старого стиля в Rails 4.2 возвращало неверные логические значения из базы данных. Это не может быть официально объявлено устаревшим, но использование обновленного синтаксиса устранило проблему.
Stevenspiel
1
@ hurikhan77 Да, это сбивает с толку, что синтаксис конфликтует с CoffeeScript coffeescript.org/#functions
Хлоя
8

Rails 4, вы можете сделать:

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

Это было в старом рубине:

:id => id

Лучший хеш:

id: id
sesperanto
источник
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) }
tokhi
источник
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.

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

mmsilviu
источник