2014-10-31 75 views
1

我想知道如何成功地設置了基於存在params是否存在一個動態的活動記錄查詢/存在。建立動態的ActiveRecord查詢Rails的

我有這個疑問

Animal.joins(:user).where(animal_type: params[:animal_type], rehomed: params[:rehomed], users: {town: params[:animal_town]}) 

我試圖沿着這些線路的東西,但我的語法都錯了,我相信

conditions = [] 
conditions << [ animal_type: params[:animal_type], ] if params[:animal_type].present? 
conditions << [ rehomed: params[:rehomed], ] if params[:rehomed].present? 
conditions << [ users: {town: params[:animal_town]} ] if params[:animal_town].present? 
@animals = Animal.joins(:user).where(conditions) 

我不想把它全部在一個嵌套的散列我呢?

任何幫助表示讚賞

感謝

+0

爲什麼你不想把它放在嵌套哈希?它應該在嵌套散列。 – 2014-10-31 13:32:49

+0

就你而言,'where'接受散列。所以使用強參數和'params'散列本身可能是一種方法。 – 2014-10-31 13:33:20

+0

OK也許我今天是緩慢的,但訪問的條件哈希我會做'在哪裏(條件:條件)'? – Richlewis 2014-10-31 13:35:36

回答

3

你要做的:

conditions = {} 
conditions.merge!(animal_type: params[:animal_type]) if params[:animal_type].present? 
conditions.merge!(rehomed: params[:rehomed]) if params[:rehomed].present? 
conditions.merge!(users: {town: params[:animal_town]}) if params[:animal_town].present? 

@animals = Animal.joins(:user).where(conditions) 
+0

避免合併更有效!:條件[:animal_type] = params [:animal_type] – ThomasSevestre 2014-10-31 14:25:27

1

我會做somethink這樣的:

scope = Animal.joins(:user) 
scope = scope.where(animal_type: params[:animal_type])  if params[:animal_type].present? 
scope = scope.where(rehomed: params[:rehomed])    if params[:rehomed].present? 
scope = scope.where(users: { town: params[:animal_town] }) if params[:animal_town].present? 

@animals = scope 

進一步改進:移動範圍的建築轉化爲動物模型的方法:

# in controller 
@animals = Animal.find_by_query(params.slice(:animal_type, :rehomed, :animal_town)) 

# in Animal model 
def self.find_by_query(query = {}) 
    query.reject { |_, v| v.blank? } 

    scope = joins(:user) 
    scope = scope.where(animal_type: query[:animal_type])  if query[:animal_type] 
    scope = scope.where(rehomed: query[:rehomed])    if query[:rehomed] 
    scope = scope.where(users: { town: query[:animal_town] }) if query[:animal_town] 
    scope 
end