2016-05-03 4 views
0

変数を特定の値に設定したいのですが、その値が有効な場合のみです。変数を値に設定するには、その値が有効な場合のみどうすればよいですか?

は今のところ、これは私が持っているコードです:

if Something.find(params[:id].comments.first.exists? 
    @comment = Something.find(params[:id]).comments.first 
else 
    @comment = nil 
end 

しかし、それは二回レコードをロードする必要があるため、これは非効率的です。

私は値が有効な場合、変数にのみ設定されることを保証するために、Rubyのメソッドtryを使用しようとしました:

@comment = Something.try.find(params[:id]).comments.first 

が、私はそれを置く、私は戻って、「nilを得るに関係なくではありません記号 "エラー。 tryは、変数を印刷するためのものです。

他に1つのクエリでこれを達成する方法が他にありますか?

+0

クエリが失敗した場合、デフォルトでは 'nil'が返されます。あなたの単一のクエリを実行し、事実の後に 'nil'をテストします。 – MarsAtomic

+0

@MarsAtomicクエリが失敗した場合、ページ全体で「レコードが見つかりません」というエラーが発生します。 –

+1

'rv = Something.find(params [:id])。comments.first; @comment = rv.exists? :rv:nil'。あなたはコードの最初の行に右のparenがありません。 –

答えて

0

試しましたか?

if @comment = Something.find(params[:id]).comments.first 
    # do something with your @comment variable 
else 
    # do something else 
end 

より多くの例:Check if record exists from controller in Rails

+0

"レコードが見つかりません"というエラーが表示されます。 –

+0

@CarySwoveland私の悪い、すでに修正されています。ありがとう。 – soltex

+0

このフォームは、平等テストのために読者によって非常に簡単に混乱します。あなたがこれを行うつもりならば、表現全体をかっこで囲んで少なくとも次のような視覚的な手がかりを与えることをお勧めします: 'if(@comment = Something.find(params [:id])。comments.first) ' –

1

あなたは試みることができる:

@comment = Comment.find_by(something_id: params[:id]) 
0
# Attempt your query 

@comment = Something.find(params[:id]).comments.first 

# If the record does not exist, use rescue to handle the exception gracefully 

rescue ActiveRecord::RecordNotFound 
    # Handle the exception 
    @comment = nil 
end 

をあなたは例外と例外処理hereに関する詳細な情報を見つけることができます。

0

私は、これはあなたが欲しいものだと思う。この場合

@comment = Something.find_by(id: params[:id]).try(:comments).try(:first) 

find_byは何かオブジェクトまたはnilを返します。 nilの場合、チェーンの試行はnilを返しますが、オブジェクトの場合は試行中のメソッドが実行され、最初のコメントがあればそれを返します(もし存在すれば、オブジェクトが存在すればnilを得るかもしれませんそのオブジェクトはコメントを持たないかもしれません)。

したがって、Somethingオブジェクトが存在し、コメントがある場合にのみ@commentを設定します。それ以外の場合はゼロになります。

関連する問題