【问题标题】:rails apply where if variable is not nil else apply all - nicer wayrails apply where if variable is not nil else apply all - 更好的方式
【发布时间】:2013-09-13 09:30:45
【问题描述】:

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

如果 co 不为零,我想将 where 条件应用于 Country 和 City,如果它为零,则应用所有条件。

  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

这是一个好方法还是有更好的方法?

【问题讨论】:

    标签: ruby-on-rails activerecord where-clause


    【解决方案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]} 
    

    【讨论】:

    • 你可以用where(co.nil? || {:id => co})写得更好
    • 我认为这段代码并不比上面的例子好。有相同的重复。将所有内容放在一条线上并不是一种改进。可读性很重要。
    • @BroiSatse,好主意,兄弟
    【解决方案2】:

    你可以试试这样的

    @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]}  
    

    【讨论】:

    • 你能说出这带来了什么效率吗?
    • 最好直接调用函数然后通过 send 间接调用它,这看起来像 Rails 方式。
    【解决方案3】:

    你会考虑这样的事情。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      相关资源
      最近更新 更多