Я бы рекомендовал добавить кэш счетчика views_count в embed.rb.Если у вас нет counter_cache и предполагается, что он есть в asset.rb:
has_many :views, :through => :embeds
, вы можете сделать что-то вроде этого:
scope :by_popularity, select("assets.*, count(views.id) AS views_count").joins(:views).order('views_count')
Если вы добавите кеш счетчика,теперь станет:
scope :by_popularity, select("assets.*, sum(embeds.views_count) AS views_count").joins(:embeds).order('views_count')