0

我有一个联系人对象数组...

[#<Contact id: 371, full_name: "Don Hofton", birthday: "2013-11-07">,...]

而且我需要按最接近当前时间的生日对它们进行排序,并从数组中删除生日超过 4 个月的对象。这是我到目前为止所得到的,但它不起作用....

@contacts_with_birthday_data = Contact.where(:user_id => current_user.id).where("birthday IS NOT NULL")
        @current_time = Time.now
        @contacts_with_birthday_data.each do |c|
            c.birthday = c.birthday[0..4]
            c.birthday = Date.parse(c.birthday)
        end
        @contacts_with_birthday_data = @contacts_with_birthday_data.sort! { |a,b| b[:birthday] <=> a[:birthday] }
        @contacts_with_birthday_data = @contacts_with_birthday_data.sort! { |a| a.birthday < DateTime.now }
4

1 回答 1

1

我认为您可以通过一个查询完成所有操作:

Contact \
  .where(:user_id => current_user.id)
  .where("birthday > ?", 4.months.ago)
  .order("birthday desc")

如果4.months.ago在作用域中使用,请确保将其包装在 lambda 或 Proc 中,否则它将在加载类时计算,而不是在后续调用中计算。这不止一次地咬了我!

或者,在非 Rails 世界中,您可以在 Enumerable 上使用reject和方法:sort_by

contacts = [#your array of contacts]
contacts.reject { |c| c.birthday < 4.months.ago }.sort_by(&:birthday).reverse

如果您还没有看到 中使用的语法sort_by,那实际上等同于sort_by { |c| c.birthday }. 该语法告诉 Ruby 将生日方法转换为 Proc 对象,然后针对数组中的每个实例调用 Proc。

于 2013-09-05T23:43:48.767 回答