Active Admin сортировка по ассоциации 2-го уровня
У меня есть три модели. И то и другое makes
а также models
стол есть name
колонна внутри.
class Review < ActiveRecord::Base
belongs_to :model
end
class Model < ActiveRecord::Base
belongs_to :make
has_many :reviews
end
class Make < ActiveRecord::Base
has_many :models
end
В Active Admin на главной странице я хочу отсортировать отзывы по марке и модели. Я выяснил, как отсортировать его по модели, потому что он имеет ключ reviews
Таблица. Перепробовал много вещей. Ничто не работает для сортировки по имени. Я был в состоянии перечислить все же.
ActiveAdmin.register Review do
column "Model", sortable: 'model_id' do |p|
p.model.name
end
column "Make", sortable: 'make_id' do |review|
review.model.make.name
end
end
Работает только сортировка по названию модели. Я думаю, если я добавлю make_id
в Reviews
это будет работать, но кажется излишним, потому что цепочка review.model.make
отлично работает
1 ответ
Скажем review
это оценка от 1 до 5. Вам нужно будет вычислить среднее значение для каждого make
,
Чтобы вычислить среднее значение для make
, делать:
reviews_sum = 0
total_reviews = 0
make.models.each do |model|
model.reviews.each do |review|
reviews_sum += review
total_reviews += 1
end
end
Затем:
average_review = reviews_sum / total_reviews.to_f # I am using to_f to convert total_reviews from integer to float. This way you can have a float result.
Я советую вам создать make_average_review(make_id, average_review)
Таким образом, вы можете хранить / обновлять ваш средний обзор для каждого make
а затем сортировать по make