2014-06-05 51 views
0

目前我有一個具有佈局的Slide模型。基於參數查詢不同的模型 - 重構

幻燈片放映動作呈現基於佈局不同的東西,但每個佈局需要查詢不同的模型。目前,我在我的控制器中有一個case語句,用於根據需要加載需求。

例如

def show 
    @slide = Slide.find(params[:id] 
    case @slide.layout 
    when 'products' 
     @products = Product.where(display: true) 
    when 'strategy' 
     @strategy = Strategy.all 
    when 'summary' 
     @quit_attempt = QuitAttempt.where(user_id: current_user.id) 
     @user_products = Product.where(user_id: current_user.id) 
     @habits = Habit.all 
    end 
end 

這是處理這個問題的最好方法嗎?有更多的佈局和不同的需求,這導致了一個很大的控制器行動。我還可以做什麼作爲替代。

我想我可以限定在讓他們的模型的方法和傳遞數組返回給控制器,以零爲未例如需要事

@products, @strategy, @habits = @slide.layout_requirements 

任何意見,將不勝感激如何我可以重構這一點。

回答

1

我不知道這是否是這樣做最徹底的方法,但你可以試試這個

定義控制器

def product_data 
    @products = Product.where(display: true) 
end 

def strategy_data 
    @strategy = Strategy.all 
end 

def summary_data 
    @quit_attempt = QuitAttempt.where(user_id: current_user.id) 
    @user_products = Product.where(user_id: current_user.id) 
    @habits = Habit.all 
end 

3種方法,然後在表演動作寫如下

def show 
    @slide = Slide.find(params[:id] 
    eval("#{@slide.layout}_data") 
end 

這應該工作:)

PS最好你必須找到一種方法來將這些查詢模式化。在控制器中編寫這麼多代碼並不常規

+0

對不起,我應該更清楚了。雖然這可以用於上面的示例2,但某些佈局查詢多個模型,但我會編輯以使其更清晰。我試圖簡潔而不是過於複雜的東西 –

+0

請檢查編輯的答案 – Himesh

+0

我這樣做,我認爲閱讀比大量的案例陳述要容易得多。我想我會使用send而不是eval。謝謝。我會拭目以待,如果不接受你的回答 –