ruby-on-rails - 按模型方法而不是数据库列过滤Rails

标签 ruby-on-rails activerecord rails-activerecord

我正在尝试在我的 Rails 应用程序中构建一个过滤器,该过滤器使用 url 参数并根据模型中的方法返回记录(根据一些不同的标准返回 true 或 false),而不是直接检查数据库。不过我遇到了一些问题。

这是我的模型中的代码

def action_required?
    true unless (self.nap_correct? && self.claimed? && self.duplicates == "")
end

在我看来,我有一个使用参数过滤结果的链接。这是代码

<%= link_to "All Messages", url_for(:action_required => true) %>

在我的 Controller 中

if params[:action_required].blank?
  @citations = @client.citations.paginate(:page => params[:page], :per_page => 50).order("id desc")
else
  @citations = @client.citations.where(:action_required => true).paginate(:page =>[:page], :per_page => 50).order("id desc")
end

现在它给了我这个错误

SQLite3::SQLException: no such column: citations.action_required: SELECT "citations".* FROM "citations" WHERE "citations"."client_id" = ? AND "citations"."action_required" = 't'

我在这里缺少什么?

最佳答案

首先,你不需要写 true except...,只需这样做

def action_required?
  self.nap_correct? && self.claimed? && self.duplicates == ""
end

然后将复杂条件转换为范围:

scope :action_required, ->(){
  self.where(nap_correct: true, claimed: true, duplicated: '')
}

然后您可以使用范围:

@citations = @client.citations.action_required.paginate(:page =>[:page], :per_page => 50).order(id: :desc)

如果您的 #nap_ Correct?claimed? 方法也是复杂的 Ruby 方法,并且不仅仅是模型中的字段,那么您需要提取它们也进入 SQL(例如创建范围)。

有一种更简单的方法:将 where 替换为 .select(&:action_required) – 这将使用 Ruby Array 方法来选择记录(因此选择是在 Ruby 中完成的) ,不在你的数据库中 - 因此它会更慢)。而且您还必须手动处理分页,因为 paginate 需要 ActiveRecord::Relation 来运行查询,而不是 Ruby Array。

关于ruby-on-rails - 按模型方法而不是数据库列过滤Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32056765/

相关文章:

c# - 在 .NET Core 中是否类似于 Ruby on Rails 中的 ActiveRecord?

ruby-on-rails - Capistrano 在 Windows 上的部署因 git 而失败

ruby-on-rails - 如何在 Ubuntu 服务器上部署 rails 项目?

ruby-on-rails - 如何将 Twitter 用户 ID 转换为 Twitter 用户名

ruby-on-rails - Rails Active Record 项目分区

ruby-on-rails - 批量销毁 Rails 事件记录中的所有内容

ruby-on-rails - Ruby on Rails - 我如何将页面顶部显示的帖子顺序更改为最新?

ruby-on-rails - 如何在 Controller 中使用 current_user 设定条件

ruby-on-rails - 默认情况下是哈姆尔

ruby-on-rails - 在 Rails 中添加可为空的外键