Я довольно долго искал ответ. Вероятно, в общей сложности 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