У меня возникает странная проблема, создающая область действия и использующая finder first
. Кажется, что использование first
как части запроса в области будет возвращать все результаты, если результаты не найдены. Если какие-либо результаты будут найдены, он вернет правильный результат.
У меня есть очень простой тест, чтобы продемонстрировать это:
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 для меня, если нет неизвестных ожиданий в отношении поведения, о которых я не знаю.