如何重构ActiveRecord查询?

时间:2015-07-29 13:03:49

标签: ruby-on-rails activerecord refactoring

我在控制器中有一个代码:

underscore

如何重构它看起来优雅? 我尝试使用lambda:

Ramda

但它只返回Lodash

UPD:如果用户已登录,我需要获得所有文章的最后10篇,如果没有,我需要获得最后10篇文章。

3 个答案:

答案 0 :(得分:7)

我会创建一个初始范围,并根据某些条件对其进行修改:

$('#activityType').trigger("change");

答案 1 :(得分:2)

你可以重构为

@lates_articles = Article.all
@lates_articles = @latest_articles.where("status = ?", Article.statuses[:public_article]) unless user_signed_in?
render json: @latest_articles.limit(10).order(id: :desc).pluck(:id, :title)

但是创建模型方法

会更好
class Article < ActiveRecord::Base
  ...
  scope :latest, -> {last(10).order(id: :desc)}

  def self.public user_signed
    if user_signed
      all
    else
      where("status = ?", statuses[:public_article])
    end
  end
  ...
end

然后你会像

一样使用它
def latest
  render json: Article.public(user_signed_in?).latest.pluck(:id, :title)
end

答案 2 :(得分:0)

最终版本:

def latest
  scope = Article.order(id: :desc)
  scope = scope.shared unless user_signed_in?
  render json: scope.limit(10), except: [:body, :created_at, :updated_at]
end