2011-09-21 48 views
0

我想更好地結合發現者。rails可以重構這個模型代碼嗎?

if params[:sort] 
    if params[:sort] == 'industry_id' 
    if params[:industry_id] 
     @companies = Company.find_all_by_industry_id(params[:industry_id], :joins => "left join industries ind on industry_id = ind.id", :order => "ind.name" + " " + sort_direction) 
    else 
     @companies = Company.all(:joins => "left join industries ind on industry_id = ind.id", :order => "ind.name" + " " + sort_direction) 
    end 
    else 
    if params[:industry_id] 
     @companies = Company.find_all_by_industry_id(params[:industry_id], :order => sort_column + " " + sort_direction) 
    else 
     @companies = Company.all(:order => sort_column + " " + sort_direction) 
    end 
    end 
else 
    if params[:industry_id] 
    @companies = Company.find_all_by_industry_id(:joins => "left join industries ind on industry_id = ind.id", :order => "ind.name" + " " + sort_direction) 
    else 
    @companies = Company.all 
    end 
end 
+0

是否有應該是在這條線的'industry_id'某處代碼:'Company.find_all_by_industry_id(:joins =>「left join industry ind ind on industry_id = ind.id」,:order =>「ind.name」+「」+ sort_direction)'? –

+0

是好趕:) :) –

回答

4

假設你有以下型號:

class Company 
    belongs_to :industry 

    def self.search p 
    opt = {:conditions => {}} 
    opt[:order] = (p[:sort] == "industry_id") ? "industries.name" : p[:sort] 
    opt[:order]+= " " + (p[:sort_direction] || "ASC") if opt[:order].present? 
    opt[:conditions][:industry_id] = p[:industry_id] if p[:industry_id].present? 
    if (p[:sort] == 'industry_id') or p[:industry_id].present? 
     opt[:include] = :industry 
    end 
    all(opt) 
    end 
end 

class Industry 
    has_many :companies 
end 

現在你可以在你的控制器使用方法search

Company.search(params) 
+0

我剛剛切換到此。喜歡基於模型的方法。對我的rspec測試來說也好多了。 –

+0

注 - 我的視圖將sort_direction作爲參數傳入,我將'p [:sort_direction]'更改爲'p [:sort_direction]''。確保你匹配那些適當的,如果使用這個答案:)邁克爾。 –

2

我是否錯過了一些東西,或者是否全部歸結爲此?

sort_joins = { 'ind.name' => 'left join industries ind on industry_id = ind.id' } 
if params[:sort] == 'industry_id' || !params[:sort] 
    sort_column = 'ind.name' 
end 

sort_column = nil if sort_column && !params[:industry_id] 

options = { } 
if sort_column 
    options[:sort] = "#{sort_column} #{sort_direction}" 
    options[:joins] = sort_joins[sort_column] if sort_joins[sort_column] 
end 
if params[:industry_id] 
    @companies = Company.find_all_by_industry_id(params[:industry_id], options) 
else 
    @companies = Company.all(options) 
end 
+0

謝謝畝。我總是很感激你的回答,當我在我的q上看到你的回覆時,我非常感謝:) –

+0

@Michael:把它推向模型(KandadaBoggu建議)也是一個好主意。 –

+0

是的,基於模型肯定更好。儘管如此,我確實發現了你的可讀性更強。我想知道是否KandadaBoggu可以減少一些,也許一些三元的,如果仍然可讀。 –