Rails 4 - undefined метод `call 'при выполнении простого запроса
Я новичок в Rails, но это кажется довольно простым. У меня есть модель с именем Game
, сгенерированная следующим образом:
rails generate model Game name:string year:integer manufacturer:string notes:string is_active:boolean
Я загрузил таблицу с некоторыми данными, и я пытаюсь получить все строки, где is_active
есть true
. Я бы хотел, чтобы моя модель была чем-то вроде:
class Game < ActiveRecord::Base
scope :active, where(:is_active => 1)
end
Моя проблема - всякий раз, когда я пытаюсь связать запрос Game.active
, я получаю сообщение об ошибке. Это та же ошибка в консоли rails или если я пытаюсь установить ее в переменную в контроллере. Ошибка:
undefined method `call' for #<Game::ActiveRecord_Relation:0x007ffadb540aa0>
При запуске в консоли я вижу:
irb(main):001:0> Game.active
NoMethodError: Game Load (0.2ms) SELECT `games`.* FROM `games` WHERE `games`.`is_active` = 1
undefined method `call' for #<Game::ActiveRecord_Relation:0x007fcdca66b800>
from /home/dcain/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/activerecord-4.1.0/lib/active_record/relation/delegation.rb:136:in `method_missing'
Ответы
Ответ 1
Rails 4+ требует, чтобы названные области были lambda
, а не просто Relation
.
Измените старую версию
scope :active, where(is_active: true)
в лямбда-версию
scope :active, lambda { where(is_active: true) }
или даже короче
scope :active, -> { where(is_active: true) }
Для получения дополнительной информации о названных областях и способах передачи параметров я предлагаю прочитать Области в руководстве Rails