Ответ 1
Я думаю, что это должно быть:
scope :find_lazy, -> (id) { where(id: id) }
Мне интересно, как это делается в 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("*") }
Что делать, если мне нужен аргумент. Я попробовал несколько разных идей и получил ошибки аргументов в консоли при использовании → {}.
Я думаю, что это должно быть:
scope :find_lazy, -> (id) { where(id: id) }
Ruby не устарел от старого стиля лямбда, поэтому, если вам будет удобнее использовать это, обязательно поймите его.
Мне лично не нравится прочный синтаксис лямбда, но в конечном итоге они, вероятно, станут нормой, поэтому им не повредит, чтобы привыкнуть к ним.
Rails 4, вы можете сделать:
scope :find_lazy, -> (id) { where(id: id) }
Это было в старом рубине:
:id => id
Лучше хеш:
id: id
Поддержка ассоциаций:
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)
}
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.
Нет причин использовать области вместе с лямбдами в качестве предпочтения методам класса. Это вопрос личных предпочтений. Но, если вы хотите следовать рекомендациям, вы должны использовать метод класса, когда используются аргументы.