Я столкнулся с странной проблемой, создающей область действия и использую finder first
. Кажется, что используя first
как часть запроса в области, он будет возвращать все результаты, если результаты не найдены. Если какие-либо результаты будут найдены, он вернет правильный результат.Rails Scope возвращает все вместо nil
Я имею установку очень простой тест, чтобы продемонстрировать это:
class Activity::MediaGroup < ActiveRecord::Base
scope :test_fail, -> { where('1 = 0').first }
scope :test_pass, -> { where('1 = 1').first }
end
Примечания для этого теста, я установил, где условия для соответствия записи или нет. На самом деле, я спрашиваю, основываясь на реальных условиях, и получаю такое же странное поведение.
Вот результаты сбойной области. Как вы можете видеть, что делает правильный запрос, который не имеет никаких результатов, так это те запросы для всех соответствующих записей и возвращает, что вместо:
irb(main):001:0> Activity::MediaGroup.test_fail
Activity::MediaGroup Load (0.0ms) SELECT "activity_media_groups".* FROM "activity_media_groups" WHERE (1 = 0) ORDER BY "activity_media_groups"."id" ASC LIMIT 1
Activity::MediaGroup Load (0.0ms) SELECT "activity_media_groups".* FROM "activity_media_groups"
=> #<ActiveRecord::Relation [#<Activity::MediaGroup id: 1, created_at: "2014-01-06 01:00:06", updated_at: "2014-01-06 01:00:06", user_id: 1>, #<Activity::MediaGroup id: 2, created_at: "2014-01-06 01:11:06", updated_at: "2014-01-06 01:11:06", user_id: 1>, #<Activity::MediaGroup id: 3, created_at: "2014-01-06 01:26:41", updated_at: "2014-01-06 01:26:41", user_id: 1>, #<Activity::MediaGroup id: 4, created_at: "2014-01-06 01:28:58", updated_at: "2014-01-06 01:28:58", user_id: 1>]>
Другая сфера работает, как ожидалось:
irb(main):002:0> Activity::MediaGroup.test_pass
Activity::MediaGroup Load (1.0ms) SELECT "activity_media_groups".* FROM "activity_media_groups" WHERE (1 = 1) ORDER BY "activity_media_groups"."id" ASC LIMIT 1
=> #<Activity::MediaGroup id: 1, created_at: "2014-01-06 01:00:06", updated_at: "2014-01-06 01:00:06", user_id: 1>
Если я выполню ту же логику за пределами области действия, я получу ожидаемые результаты:
irb(main):003:0> Activity::MediaGroup.where('1=0').first
Activity::MediaGroup Load (0.0ms) SELECT "activity_media_groups".* FROM "activity_media_groups" WHERE (1=0) ORDER BY "activity_media_groups"."id" ASC LIMIT 1
=> nil
Я что-то пропустил? Это кажется ошибкой в Rails/ActiveRecord/Scopes для меня, если нет каких-то неизвестных ожиданий в отношении поведения, о которых я не знаю.
'.first' возвращает запись, а не AREL, верно? – Satya
, какую версию рубинов и рельсов вы используете? – shiva
@shiva - Rails 4 и Ruby 2.0 – Ryan