Rails: Как отсортировать массив атрибутов по имени связанного атрибута - PullRequest
0 голосов
/ 29 августа 2018

Как можно отсортировать массив идентификаторов людей по Person.name, полученному из модели Group, которая имеет ассоциацию has_many с моделью Person и проходит через модель GroupParticipation?

<OpenStruct id=1, name="GroupName", person_ids=[199, 276, 233, 214, 248, 252, 236]>

Модель человека:

# Table name: people
#
#  id                          :integer          not null, primary key
#  name                        :string(255)

has_many :groups, through: :group_participations, source: :person_group

Персона :: Групповая модель:

# Table name: person_groups
#
#  id                   :integer          not null, primary key
#  name                 :string(255)
#  details              :hstore
#  created_at           :datetime
#  updated_at           :datetime
#  show_job_description :boolean          default(FALSE)

has_many :group_participations, foreign_key: "person_group_id"

has_many :people, through: :group_participations

Персона :: Групповая модель участия

# Table name: person_group_participations
#
#  id                :integer          not null, primary key
#  person_group_id   :integer
#  person_id         :integer
#  created_at        :datetime
#  updated_at        :datetime
#  registration_date :date
#  expiry_date       :date

belongs_to :person belongs_to :person_group, class: Person::Group

ContactsController

> def index
>     @groups = Person::Group.all
>     people_ids = @groups.map(&:person_ids).flatten
>     @people = Person.where(ids: people_ids)   
> end

index.html.slim

   - @groups.each do |group|
     h2 = group.name
     - group.person_ids.each do |id|
       - next if (person = @people.find{|p| p.id == id}).blank?

         details.full-width
         .name= person.name

1 Ответ

0 голосов
/ 29 августа 2018

Возможно, попробуйте (при условии, что у вас есть @group):

@group.people.order(name: :asc).pluck(:id)

Чтобы получить массив как [199, 276, 233, 214, 248, 252, 236].

Я уверен, что что-то неправильно понимаю, но почему бы вам не сделать что-то более похожее на:

ContactsController

def index
  @groups = Person::Group.all
end

index.html.slim

- @groups.each do |group|
  h2 = group.name
  - group.people.order(name: :asc).each do |person|
    details.full-width
      .name= person.name

Заранее извиняюсь, если я испортил slim, я сам haml пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...