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

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

Ответ 1

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

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

Ответ 2

Ruby не устарел от старого стиля лямбда, поэтому, если вам будет удобнее использовать это, обязательно поймите его.

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

Ответ 3

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

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

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

:id => id

Лучше хеш:

id: id

Ответ 4

Поддержка ассоциаций:

scope :find_lazy, -> (object) { where(object_id: object.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)
  }

Ответ 6

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

эквивалентно

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

На основе руководства ruby on rails: Using a class method is the preferred way to accept arguments for scopes.

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