2011-09-21 46 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可以减少一些,也许一些三元的,如果仍然可读。 –