按字段可用性排序对象

loc*_*boy 1 ruby sorting ruby-on-rails

我有一个place具有以下参数对象:phone,category,street,zip,website.

我还有一个place对象数组:[place1, place2, place3, place4, place5].

place根据参数可用性对s 数组进行排序的最佳方法是什么?即,如果place1具有最可用的参数,或者参数的数量最少nil,则应该首先重新排序,依此类推.

编辑:这些对象不是ActiveRecord对象

Mar*_*mas 5

我让每个Place对象知道它是多么完整:

class Place
  attr_accessor :phone, :category, :street, :website, :zip

  def completeness
    attributes.count{|_,value| value.present?}
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,通过完整性很容易对场所对象进行排序:

places.sort_by(&:completeness)
Run Code Online (Sandbox Code Playgroud)

编辑:非ActiveRecord解决方案:

我认为这是一个ActiveRecord模型,因为Ruby on Rails标签.由于这是一个非ActiveRecord模型,您可以使用instance_variables而不是attributes.(顺便说一句,祝贺知道Rails中的域模型不必从ActiveRecord继承)

class Place
  attr_accessor :phone, :category, :street, :website, :zip

  def completeness
    instance_variables.count{|v| instance_variable_get(v).present?}
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑2:加权属性

您有关于计算加权分数的评论.在这种情况下,或者当您想要选择特定属性时,可以将以下内容放入模型中:

  ATTR_WEIGHTS = {phone:1, category:1, street:2, website:1, zip:2}

  def completeness
    ATTR_WEIGHTS.select{|k,v| instance_variable_get(k).present?}.sum(&:last)
  end
Run Code Online (Sandbox Code Playgroud)

请注意,sum(&:last)相当于sum{|k,v| v}其中的铁路reduce(0){|sum, (k,v)| sum += v}.