Выбрать и упорядочить родительскую запись по дочернему атрибуту Ruby on Rails - PullRequest
0 голосов
/ 07 июня 2018

У меня есть два рубиновых класса, вакансии и листинги.

Список атрибутов: job_id, live_date, is_active

Атрибуты задания: title, description, category

Если я хочуполучить сведения о 2 вакансиях из одной категории, в которой дата актуального листинга относится к двум самым последним, и листинг активен, есть ли эффективный однострочный рубин, который я мог бы использовать?

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

Желаемый результат

Два результата работы, где оба спискаactive и live_dates являются самыми последними.(Работа в этом случае будет иметь только 1 активный список.)

@jobs = [
  {
    title: 'Job Title',
    description: 'Job Description',
    category: 'marketing'
  },
  {
    title: 'Job Title',
    description: 'Job Description',
    category: 'marketing'
  }
]

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Если я правильно понял ваши требования, вам нужно получить два самых последних списка работ по всей категории, а не только два последних списка по одной работе?

Со своей стороны, я всегда предпочитаю инкапсулировать логику, связанную с моделью, внутри модели (по причинам DRY и MVC), поэтому обычно я работаю с областями действия :

class Listing
  belongs_to :job

  scope :is_active, -> { where(is_active: true) }
  scope :ordered_by_live_date -> { order(live_date: desc }
end

class Job
  has_many :listings

  def most_recent_category_listings(limit)
    # If you just need the most recent listings of this job,
    # remove .include and .where and rename Listing to listings
    Listing.include(:jobs).where(jobs: {category: self.category}).is_active.ordered_by_live_date.limit limit
  end
end

Примечание: не проверялось, я пишу это только из головы, не делал никаких Ruby в течение некоторого времени

0 голосов
/ 07 июня 2018

Полагаю, вы сможете использовать следующее.Он не проверен, поэтому может потребоваться настройка или два, но он должен вернуть два jobs, которые вы запросили:

Job.eager_load(:listings).order("listings.live_date DESC").where(category: "your category", listings: { active: true }).first(2)

Чтобы разбить это:

  • eager_load предварительных загрузокваши списки, так что вы можете использовать их в своем запросе.Если вы не используете их ни для чего другого, outer_joins может быть лучшим выбором и более производительным
  • order применяет указания к элементу ORDER BY сгенерированного SQL
  • Предложение where позволяет запрашивать jobs, а также связанный listings, передавая хэш, указанный в качестве значения
  • first(2), возвращает первые две записи, в данном случае требуемые из-зак заказу на месте
...