Эффективное извлечение людей и задачи, которые им недавно поручены - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть следующие простые настройки:

create_table "people", :force => true do |t|
  t.string   "name"
end

create_table "tasks", :force => true do |t|
  t.string   "description"
  t.integer  "person_id"
  t.date     "started_on"
  t.date     "ended_on"
end

class Person < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :person
end

Предполагая, что задачи, назначенные человеку, никогда не пересекаются во времени,

  • Как бы вы эффективно извлекли самую свежую работу каждого человека?
  • Кроме того, как бы вы выбрали всех людей, которые на сегодняшний день не имеют работы?

До сих пор мне удавалось находить решения с неэффективными запросами и большим количеством кода ruby. Вместо этого мне интересно, предлагает ли ActiveRecord идиоматические способы построения таких поисков.

Я подумал, например, чтобы искать самые последние вакансии таким образом:

Task.group(:person_id).maximum(:ended_on)

но я получаю ActiveSupport :: OrderedHash, тогда как мне нужны модели задач и связанные с ними люди.

Спасибо! Джузеппе

1 Ответ

0 голосов
/ 15 ноября 2011

In Person model

def last_job
     self.jobs.order("started_on DESC").limit(1)
end

Вы можете написать scope для фильтрации заданий на "открытые" задания, которые еще не были выполнены следующим образом:

scope :finished_jobs, where("ended_on IS NOT NULL")
scope :unfinished_jobs, where("ended_on IS NULL")

Так что вы также можетеделать

def is_unemployeed?
     self.jobs.unfinished_jobs.empty?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...