ActiveModel :: Serializer排序和序列化

时间:2016-12-26 15:46:45

标签: ruby sorting activerecord serialization model

例如我有两个activeRecord模型:

class Article < ActiveRecord::Base
  has_one :article_poster
end

class ArticlePoster < ActiveRecord::Base
  belongs_to :article
end

在某些控制器中:

CustomSerializer.new(articles)

CustomSerializer:

class CustomSerializer < ActiveModel::Serializer
end

我有4篇文章,有海报,没有它。 例如:
第一篇海报出席 第二篇海报不存在
第3篇海报礼物
第4篇海报礼物

我需要海报出席的文章:1,3,4,2。 在CustomSerializerArticle模型中实施它的最佳方式是什么?

2 个答案:

答案 0 :(得分:0)

我的解决方案是:

class CustomSerializer < ActiveModel::Serializer

  def initialize(resources, options = {})
    resources = sort(resources) 
    super(resources, options)
  end

  def sort(resources)
    top = []
    regular = []
    resources.each do |article|
      if article.poster
        top << article 
      else
        regular << article
      end
    end
    resources = top + regular
  end

end

答案 1 :(得分:0)

这是使用sql

的解决方案
class Article < ActiveRecord::Base
  has_one :article_poster

  scope :join_article_posters, -> {
    joins('LEFT OUTER JOIN article_posters ON article_posters.article_id = article.id') }
  }

  scope :posters_first -> { join_article_posters.order(article_posters: { id: :desc }) }
end
根据您的数据库

posters_first可能会有更好的完成

CustomSerializer.new(articles.posters_first)