Jestem zmieszany.

Mam kilka notatek i potrzebuję ich, aby były sortowane przez pilność. Pilność to atrybut wirtualny, określony jak więc:

def urgency
  self.primary_tag.importance * time_since_last_seen
end

Nie sądzę, że jest to istotne dla problemu.

Mam get_most_urgent def, do .. errr ... uzyskać najbardziej pilne.

def self.get_most_urgent
  Note.all.sort_by{|i| - i.urgency}.first
end

To działa ... czasami. Mam tę szaloną sytuację w jednym z moich testów (przepraszam, nazywam moją testową notatki @BOB i @trey. Powinienem je zmienić)

[1] pry(#<RSpec::ExampleGroups::Note>)> @trey.urgency
 => 12
[2] pry(#<RSpec::ExampleGroups::Note>)> @bob.urgency
=> 9
 [3] pry(#<RSpec::ExampleGroups::Note>)> Note.get_most_urgent
 => #<Note:0x007fdf801924d8 id: 732, body: "bob", todo_by: nil, 
 last_seen: Mon, 19 Feb 2018, created_at: Mon, 19 Feb 2018 09:00:06 
  UTC +00:00, updated_at: Mon, 19 Feb 2018 09:00:06 UTC +00:00, 
 seentoday: false>

Jak widać, zwraca Bob jako najbardziej pilny. Myślałem, że po prostu nie wolno rozumieć, jak sortować prace i zmienić - i.urgency do po prostu i.urgency ... ale powoduje to kolejny test zawieść w podobny sposób ....

Jakiś pomysł, co się dzieje?! Co nie rozumiem o sort_by?

-----EDYTOWAĆ--------

To było nic wspólnego z pewnością, to był problem wytrwałości ... Nie możesz ustawić atrybutów takich jak ten self.last_seen = Date.today. Musisz to uratować! Lub użyj wzoru jak: self.update(last_seen: Date.today)

2
Paul Harker 19 luty 2018, 12:09

3 odpowiedzi

Najlepsza odpowiedź

Ładowanie wszystkich notatek na pamięć najpierw po prostu posortuj je i zwróć pierwszy rekord nie skala dobrze z większą liczbą uwag w bazie danych.

Zamiast tego sugerowałbym sortować rekord w bazie danych i ładować tylko jeden rekord, którego faktycznie potrzebujesz.

Dodałbym zakres by_urgency do modelu Note, który umożliwia sortowanie rekordu w bazie danych:

# in models/note.rb
scope :by_urgency, lambda {
  joins(:primary_tag).
    order("tags.importance * DATEDIFF(day, notes.created_at, NOW()) DESC")
}

Dzięki temu zakresie możesz przepisać swoją metodę get_most_urgent w ten sposób:

def self.get_most_urgent
  Note.by_urgency.first
end
3
spickermann 19 luty 2018, 11:15

Nie widzę, dlaczego nie powinno działać, ale może to być sposób, w jaki analizuje operatora UNIARD?

Może spróbuj ...

Notel.all.sort_by{|note| (0 - note.urgency) }.first

Albo możesz spróbować tego ...

Note.all.sort {|a,b| b.urgency <=> a.urgency}.first
0
SteveTurczyn 19 luty 2018, 09:23

Czy jesteś pewien, że primary_tag.importance jest liczbą całkowitą? Zarówno mnożliwie, jak i minus nie wygenerowali błędu dla ciągów.

Spróbuj tego...

def urgency
  self.primary_tag.importance.to_i * time_since_last_seen.to_i
end
0
SteveTurczyn 19 luty 2018, 09:39