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

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

Я довольно новичок в 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("*") } Что делать, если мне нужен спор. Я попытался несколько разных идей и получить аргумент ошибки в консоли при использовании -> {}.

Ответы на вопрос(6)

Решение Вопроса

Я думаю, что это должно быть

 scope :find_lazy, -> (id) { where(id: id) }
 furman8722 авг. 2015 г., 21:07
Обратите внимание, что если вы используете Ruby 1.9, короткий лямбда-синтаксис не допускает пробела между стрелкой и параметром (scope :find_lazy, ->(param)). В Ruby 2+ пробел разрешен.Подробнее здесь ... »
 swordray07 авг. 2017 г., 15:43
Современный" синтаксис в Rubyscope :find_lazy, -> id { where id: id }
 Dennis04 февр. 2014 г., 19:40
Сопутствующая документация, раздел 14.1 конкретно.
 Epigene04 мар. 2015 г., 13:41
Уя, помог мне написатьscope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }

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

Я неЛично мне нравится "лямбда"Синтаксис сам, но в конечном итоге они, вероятно, станут нормой, так что это не такБольно привыкать к ним.

 hurikhan7719 мая 2014 г., 19:18
Мне нравится синтаксис, но кажется неправильным размещать аргументы между стрелкой и телом функции, хотямы были "(id) -> { где ... }" это было бы намного более привлекательно (и не нарушало бы ни моего знания математики, ни синтаксиса coffeescript). В конце "->" говорит что-то вроде отображения значений на результат.
 Chloe04 мая 2018 г., 18:59
@ hurikhan77 Да, это такСмущает, что синтаксис конфликтует с CoffeeScriptcoffeescript.org/#functions
 mr.musicman13 мая 2015 г., 21:26
Я столкнулся с ситуацией, когда использование старого стиля в Rails 4.2 возвращало неверные логические значения из базы данных. Это не может быть официально объявлено устаревшим, но использование обновленного синтаксиса устранило проблему.
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.

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

Для поддержки ассоциаций:

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

я обычно использовал синтаксис программирования ниже

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

Но когда я просматривал свой код с использованием Codacy, я обнаружил, что он предупреждает меня об этом синтаксисе

Use the `lambda` method for multiline lambdas.

Я изменил это, чтобы оно работало хорошо

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

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

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

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

:id => id

Лучший хеш:

id: id

Ваш ответ на вопрос