2016-07-19 8 views
0

Ich habe eine Methode, die eine ActiveRecord_Relation zurückgibt, und ich möchte eine where -Klausel concat, wenn die ID empfangen in params nicht null ist. So etwas wie diesWie eine concate nur eine where-Klausel, wenn ID ist nicht null

query.where(item_id: params[:item_id]) # only if params[:item_id] is not null. 

query # only if params[:item_id] is null. 

Es wäre eine Abfrage wie die ersten perfekt sein:

query.where(item_id: params[:item_id]) 

, in dem ein Nullwert die ganze entkräftet, wo statt einen item_id mit Null-ID zu suchen.

Natürlich kann ich dies mit einer bedingten tun. Aber ich würde gerne wissen, ob es einen Schienenweg gibt, um dies zu tun. Ein One-Liner oder etwas

Vielen Dank!

Antwort

0

Verwenden Sie einen Bereich in Ihrem Modell - damit können Sie Abfragen auf Modelle eingrenzen. Scopes immer eine Abfrage zurückgeben, so dass Sie so etwas wie die folgenden tun können (vorausgesetzt, das Modell Sie die Abfrage so etwas wie Product genannt wird):

class Product < ActiveRecord::Base 
    scope :by_item_id, -> (item_id) { where(item_id: item_id) if item_id } 
end 

Dann können Sie Product.by_item_id(params[:item_id]) nennen.

0

Schreibbereich ist eines der besten Dinge, wenn Sie die Abfrage wiederholen würden. Wenn nicht, können Sie einfach tun:

query.where(item_id: params[:item_id]) if params[:item_id] 
+0

aber mit dieser Lösung, wenn params [: item_id] null ist, die gesamte Abfrage wird nicht ausgeführt. Ich möchte nur abfragen, wenn params [: item_id] gleich Null ist – Quin