0

この Rails コードを最適化/リファクタリングする方法、

co が nil でない場合は国と都市に where 条件を適用し、nil の場合はすべて適用します。

  def pre(co = nil,ci = nil)

    cond1 =  co.nil? ? "all" : "where(:id => co)"
    cond2 =  ci.nil? ? "all" : "where(:id => ci)"

    @countries = Country.send(cond1).order(:name).map{|i| [i.name,i.id]}  
    @cities = City.send(cond2).order(:name).map{|i| [i.name,i.id]}  

  end

それは良い方法ですか、それとももっと良い方法はありますか?

4

3 に答える 3

0

このようなものを試すことができます

@country = Country
@city = City

if co.blank?
@country = @country.where(:id => co)
end

if ci.blank?
@city = @city.where(:id => ci)
end

@countries = @country.order(:name).all.map{|i| [i.name,i.id]}  
@cities = @city.order(:name).all.map{|i| [i.name,i.id]}  
于 2013-09-13T09:42:08.653 に答える
0

このようなことを考えるでしょう。

def pre(co = nil, ci = nil)
  @countries = scopify(Country, co)
  @cities    = scopify(City, ci)
end

def scopify(model_or_scope, attribute)
  scope = model_or_scope.scoped
  scope = scope.where(:id => attribute) if attribute.present?
  scope.order(:name).map { |s| [s.name, s.id] }
end
于 2013-09-13T10:07:58.347 に答える