スコープを作成してfirst
ファインダを使用するという奇妙な問題が発生しています。スコープ内のクエリの一部としてfirst
を使用すると、結果が見つからない場合はすべての結果が返されるように見えます。結果が見つかると、最初の結果が正しく返されます。このテストのためのRailsスコープは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のバグのように思えますが、私が気づいていない未知の行動の期待がない限り、私には分かりません。
'右、記録、ないARELを返す.first'? – Satya
あなたはどのバージョンのルビーとレールを使用していますか? – shiva
@shiva - Rails 4とRuby 2.0 – Ryan