ruby-on-rails - 如何重构 ActiveRecord 查询?

标签 ruby-on-rails activerecord refactoring

我在 Controller 中有一个代码:

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

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

extract = lambda {|a| a.order(id: :desc).pluck(:id, :title)}
Article.limit(10) {|a| a.extract}

但它只返回 Article.limit(10)

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

最佳答案

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

def latest
  scope = Article.order(id: :desc)
  scope = scope.where(status: Article.statuses[:public_article]) if user_signed_in?

  render json: scope.limit(10).pluck(:id, :title)
end

关于ruby-on-rails - 如何重构 ActiveRecord 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31701247/

相关文章:

ruby-on-rails - 捆绑安装 - 需要 Ruby 版本 >= 1.9.2?

mysql - 从 Rails 3 调用 MySQL 存储过程(返回结果集)时出错

php - Codeigniter - 尝试检索 8500 条记录时出现空白屏幕

c# - 'Flattening'(简化)C#源的工具

delphi - Delphi 7 中的 "Rename control"?

c# - 如何重构常用的这些快捷键

ruby-on-rails - 传入外部 POST 请求的 Rails CSRF token 真实性

ruby-on-rails - rake 任务在另一个项目中执行 bundle 安装

ruby-on-rails - 如何进行迁移以更新表 RAILS

ruby-on-rails - 如何在Rails中更改记录的主要ID?