Создать массив из ActiveRecords Association CollectionProxy

#ruby-on-rails #ruby #arrays #activerecord #ruby-on-rails-4

#ruby-on-rails #ruby #массивы #activerecord #ruby-on-rails-4

Вопрос:

У меня есть групповая модель, какие has_many темы. Темы моделируют has_many сообщения. Я хочу создать массив всех тем для группы, отсортированных по атрибуту Post :published_on .

На моей странице группового показа у меня есть @group.topics.collect {|x| x.posts } который возвращает ActiveRecord::Associations::CollectionProxy массив с каждым элементом, содержащим массив объектов post.

 [
[[topic1 post],[topic1 post],[topic1 post]],
[[topic2 post],[topic2 post],[topic2 post]],
[[topic3 post],[topic3 post],[topic3 post]],
]
 

Как мне создать единый массив записей, отсортированных по :published_on ?

Ответ №1:

Я думаю, что

 group.topics.includes(:posts).order("posts.published_on").map(amp;:posts).flatten
 

было бы достаточно.

Комментарии:

1. Согласен с этим ответом. Я бы использовал .pluck(:posts) вместо .map

Ответ №2:

Вы также можете решить эту проблему с помощью правильных отношений.

В вашей Group модели вы могли бы сделать что-то вроде:

 # you already have this relation
has_many :topics
# you add this
has_many :posts, through: :topics
 

Это работает, используя topics как мост для posts , и возвращает все posts , что у вас group есть.

И тогда ваш запрос будет выглядеть примерно так group.posts.order(:published_on)