首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveModel::序列化器排序和序列化

ActiveModel::序列化器排序和序列化
EN

Stack Overflow用户
提问于 2016-12-26 15:46:45
回答 2查看 264关注 0票数 0

例如,我有两个activeRecord模型:

代码语言:javascript
复制
class Article < ActiveRecord::Base
  has_one :article_poster
end

代码语言:javascript
复制
class ArticlePoster < ActiveRecord::Base
  belongs_to :article
end

在某些控制器中:

代码语言:javascript
复制
CustomSerializer.new(articles)

CustomSerializer:

代码语言:javascript
复制
class CustomSerializer < ActiveModel::Serializer
end

我有4篇文章,有海报,没有海报。例如:

第一篇海报

第二篇文章海报不存在

第三篇海报

第四篇海报

我需要文章以海报的形式排列: 1,3,4,2。在CustomSerializerArticle模型中实现它的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-26 17:00:18

我的解决办法是:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2016-12-26 18:12:35

下面是使用sql的解决方案

代码语言:javascript
复制
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可能会做得更好。

代码语言:javascript
复制
CustomSerializer.new(articles.posters_first)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41333422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档