В моделях Rails не осведомлены о запросе - у них нет доступа к параметрам, объекту запроса или сеансу.
Для передачи параметров из контроллера в модель, которую выпередайте их как аргументы метода:
class Thing < ApplicationRecord
def self.sounds_like(value)
where('title ILIKE ?', "#{ value }%")
end
end
# call it as:
Thing.sounds_like('foo')
scope
- это всего лишь синтаксический сахар , который позволяет вам писать методы класса кратко.Таким образом, вышеприведенное было бы записано как:
class Thing < ApplicationRecord
scope :sounds_like, ->(value){ where('title ILIKE ?', "#{ value }%")}
end
Второй аргумент scope
- это lambda - анонимная функция, которая действует как метод:
irb(main):001:0> l = -> (v) { puts v }
=> #<Proc:0x007f81dca27d48@(irb):1 (lambda)>
irb(main):002:0> l.call("Hello World")
Hello World
=> nil
Паренс обозначает аргументы лямбды, как при определении методов:
irb(main):016:0> lamb = -> (a, b) { [a,b].join(" ") }
=> #<Proc:0x007f81dc983ec8@(irb):16 (lambda)>
irb(main):017:0> lamb.call("Hello", "World")
=> "Hello World"