2010-12-01 25 views

答えて

4

あなただけのIDのいずれかが、ActiveRecord :: RecordNotFound例外をraiseしますfind方法が存在しない場合は、この

class Model 
    def self.not_exists?(ids) 
    self.find(ids) 
    false 
    rescue 
    true 
    end 
end 

を試すことができますIDによってレコードを検索する必要がある場合、我々は単にキャッチtrueを返します。

言い訳私の英語:)

22

オペレータ

!Model.exists?(:id => [1, 2, 3]) #=> true 
+2

私はあなたのユースケースは、このようなものであると想像します'2'と' 3'が存在しない場合、どうやってfalseに戻すのかを尋ねる。 '' Model.exists?(:id => [1、2、3]) '' 1 'が存在すれば' false'を返し、 'Model.not_exists?(:id => [1、2、3] ) 'が存在しない場合はtrueを返します。 –

+1

'Model.find(ids_ary).count'それから'レスキューActiveRecord :: RecordNotFound' –

1
class Model 
    def self.does_not_exist?(ids) 
    Model.where(id: ids).count < ids.size 
    end 
end 

説明:すべてのインスタンス(および場合のみ)、あなたが存在を探しているなら、Model.where(id: ids).countids.sizeに等しいです。

インスタンスが1つ以上存在しない場合、カウントは低くなります。つまり、存在しないレコードが存在することを意味します。

+2

説明があればもっと役に立ちます – R3tep

+0

説明が追加されました。 –

-1

もう1つの簡単な方法は、idの配列でwhereメソッドを使用することです。

# If the count of the query is equal to the count of all of the id's then the statement will return false. 
# Else it will return true if not all ids exists in the database. 
Model.where(id: [1, 2, 3]).count < [1,2,3].count 
1

empty?を使用してください。これは必要なものです。これは、count(*)select 1 as oneを使用します。それをやっての

> Rocketeer.where(:id => [1, 2, 3]).empty? 
    (0.6ms) SELECT COUNT(*) FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3) 
=> false 

> Rocketeer.where(:id => [1, 2, 3]).any? 
    (0.5ms) SELECT COUNT(*) FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3) 
=> true 

> Rocketeer.where(:id => [1, 2, 3]).exists? 
    Rocketeer Exists (0.5ms) SELECT 1 AS one FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3) LIMIT 1 
=> true 
+5

'SELECT 1 AS 1 ... LIMIT 1'は' SELECT COUNT(*) 'より効率的ですか? –

0

以上のRuby風の道は、exists?unlessを使用することです。この方法では、!を使用する必要はありません。

def my_method 
    return unless Model.exists?(:id => [1, 2, 3]) 

    # do something 
end 

あなたは置き換えることができ1, 2, 3変数(idか何かをそれを呼び出す)、さらには完全に配列を削除すると、あなたが好きな場合:私は.exists?(id: id)

関連する問題