1

查詢的非流利準備我的代碼在我的模型一點點,看起來像這樣:在ActiveRecord的

query = open 

if options.has_key? "user_id" 
    query = query.where({ 
    :user_id => user_id 
    })  
end 

if options.has_key? "shop_id" 
    query = query.where({ 
    :shop_id => shop_id 
    }) 
end 

出於好奇,是有辦法,我可以告訴我的查詢對象簡單地「保留「我分配它的where子句(比如,如果同時存在:shop_id和:user_id)。因此,防止我總是不得不將結果分配回本地查詢變量?

+0

你爲什麼不使用範圍? – Khaled

回答

1

爲什麼不使用scopes

例如,你將有:

scope :for_user, lambda { |user| where(user_id: user.id) } 
scope :for_shop, lambda { |shop| where(shop_id: shop.id) } 

然後打電話給他們兩個

model.for_user(@user).for_shop(@shop) 
+0

這甚至沒有發生在我身上!我一直在做一堆重構,並且正在閱讀Rails Antipatterns書。他們在那裏展示了lambda範圍技術。我想我沒有聯繫!然而

+0

一個問題是,它會移動一些有條件的代碼返回到我的控制器。在這種情況下是否正確? –

+0

我不能判斷,直到我知道你正準備在控制器中實現什麼。 – Khaled

1

你也可以在你的模型中定義的方法

用戶

def for_user(user) 
    where("user_id = ?", user.id) 
end 

和商店

def for_shop(shop) 
    where("shop_id = ?", shop.id) 
end 

還可以結合這兩種方法

def for_user_or_shop(user_shop) 
    where("#{user_shop}_id = ?", user_shop.id) 
end 

注意:如果你傳遞範圍那麼最好再方法,所以使用範圍

+0

不錯的工作@dipak panchal :) – SagarPPanchal