0

如何优化/重构此 Rails 代码,

如果 co 不是 nil,我想将 where 条件应用于 Country 和 City,如果它是 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

1
@countries = Country.where(co.nil? || {:id => co}).order(:name).map{|i| [i.name,i.id]}  
@cities = City.where(ci.nil? || {:id => ci}).order(:name).map{|i| [i.name,i.id]} 
于 2013-09-13T09:47:49.053 回答
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 回答