#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)