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对象
我让每个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}.