Rails: Active Query, получение последних элементов всех объектов (навалом) в отношении has_many - PullRequest
0 голосов
/ 02 мая 2018

Я довольно долго искал ответ. Вероятно, в общей сложности 30 часов прерывистого поиска по мере необходимости, но мне всегда не удавалось найти ответ, который дал бы желаемые результаты. Поэтому я решил задать вопрос здесь, в SO, вместо того, чтобы добавить больше часов к поиску.

Позвольте мне выложить модели в код, чтобы помочь вам лучше понять сценарий.

class Employee < ApplicationRecord
  has_many :employee_locations
  has_many :countries, through: employee_locations
end

class EmployeeLocation < ApplicationRecord
  belongs_to :employee
  has_one    :country
end

class Country < ApplicationRecord
  belongs_to :employee_location
end

Если я хочу отобразить массовый список (@employees), в котором все Сотрудники и все остальные данные связаны с каждым сотрудником (Имя сотрудника, Расположение сотрудника (то есть название страны)). И я хотел, чтобы это было упорядочено по стране.имя, где сотрудник находится по последней записи employee_location, как мне поступить в коде? (имеет ранчо)

Ближайший (несмотря на часы поиска) -

@employees = Employee.includes(:countries).order('countries.name asc').ransack(params[:put_any]).result

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

Я совершенно не понимаю, как двигаться дальше, поскольку все SO / вопросы, которые я посетил, являются неудовлетворительными. Поэтому я задаю вопрос о том, как получить последние элементы всех объектов в отношении has_many (все последние employee_locations для всех объектов employee), надеюсь, без преобразования в массив.

Помните, что у сотрудника есть _many employee_locations.

Хочу подчеркнуть, что это должно быть навалом (@employees), а не одна за другой (@employee), поскольку с системой связано более 50 000 записей, и поэтому она будет замедлена такой код.

Edit: Просто чтобы помочь вам с намеченным сценарием / результатом.

Employees = A, B, C, D, E
Location = 1, 2, 3

The following locations are entered into the system in order
Employee A locations = 1, 2
Employee B locations = 2, 3
Employee C locations = 3, 1
Employee D locations = 2, 1
Employee E locations = 1, 3

The list should display:
Name       | Location
Employee C | Location 1
Employee D | Location 1
Employee A | Location 2
Employee B | Location 3
Employee E | Location 3

Previous attempts are displaying:
Name       | Location
Employee A | Location 2
Employee E | Location 3
Employee B | Location 3
Employee D | Location 1
Employee C | Location 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...