Tôi có một mảng hai phần tử của đối tượng ActiveRecord, slots_to_import
. Các đối tượng này có các cột begin_at
và do đó là các thuộc tính. Tôi đã cố gắng để có được các đối tượng có giá trị begin_at
duy nhất. Than ôi, slots_to_import.uniq_by(&:begin_at)
không hoạt động. Nhưng begin_at
giá trị đều bình đẳng cho hai đối tượng:Tính lạ lùng của Ruby: x == y && [x, y] .uniq == [x, y]
(rdb:1) p slots_to_import.first.begin_at == slots_to_import.last.begin_at
true
(rdb:1) p slots_to_import.uniq_by(&:begin_at).map(&:begin_at)
[Mon, 26 Nov 2012 19:00:00 UTC +00:00, Mon, 26 Nov 2012 19:00:00 UTC +00:00]
(rdb:1) p [slots_to_import.first.begin_at, slots_to_import.last.begin_at].uniq
[Mon, 26 Nov 2012 19:00:00 UTC +00:00, Mon, 26 Nov 2012 19:00:00 UTC +00:00]
Một số chi tiết kiểm tra xung quanh:
(rdb:1) p [slots_to_import.first.begin_at.to_datetime, slots_to_import.last.begin_at.to_datetime].uniq
[Mon, 26 Nov 2012 19:00:00 +0000]
(rdb:1) p [slots_to_import.first.begin_at.usec, slots_to_import.last.begin_at.usec].uniq
[0]
(rdb:1) p [slots_to_import.first.begin_at.to_f, slots_to_import.last.begin_at.to_f].uniq
[1353956400.0]
(rdb:1) p [slots_to_import.first.begin_at.utc, slots_to_import.last.begin_at.utc].uniq
[Mon, 26 Nov 2012 19:00:00 +0000]
(rdb:1) p [slots_to_import.first.begin_at, slots_to_import.last.begin_at].uniq
[Mon, 26 Nov 2012 19:00:00 UTC +00:00, Mon, 26 Nov 2012 19:00:00 UTC +00:00]
Tôi nghĩ có lẽ uniq đã được kiểm tra xem họ đã cùng một đối tượng (vì họ không). Nhưng không, một số noodling trong giao diện điều khiển đường ray của tôi cho thấy tôi rằng nó không sử dụng một id đối tượng kiểm tra:
1.8.7 :111 > x = Time.zone.parse("Mon, 29 Oct 2012 19:29:17 UTC +00:00")
=> Mon, 29 Oct 2012 19:29:17 UTC +00:00
1.8.7 :112 > y = Time.zone.parse("Mon, 29 Oct 2012 19:29:17 UTC +00:00")
=> Mon, 29 Oct 2012 19:29:17 UTC +00:00
1.8.7 :113 > x == y
=> true
1.8.7 :114 > [x, y].uniq
=> [Mon, 29 Oct 2012 19:29:17 UTC +00:00]
Tôi đang sử dụng Ruby 1.8.7p358 và ActiveSupport 3.2.0. BTW, tôi có thể giải quyết vấn đề của riêng mình bằng cách chỉ cần thêm một số to_datetime
, nhưng tôi thực sự tò mò tại sao điều này không hoạt động nếu không có chuyển đổi.
Bạn đã thử so sánh kết quả của 'x.hash' và' y.hash'? – hammar
@hammar: Đó là một ý tưởng thú vị khi thấy 'uniq_by' là Hash dựa. –
@hammar 'x.hash' và' y.hash' cũng bằng nhau! - '(rdb: 1) p slots_to_import.first.begin_at.hash == slots_to_import.last.begin_at.hash => true' – ehsanul