首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按模型方法过滤,而不是按db列栏杆过滤

按模型方法过滤,而不是按db列栏杆过滤
EN

Stack Overflow用户
提问于 2015-08-18 01:57:23
回答 1查看 2.1K关注 0票数 2

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

下面是我的模型中的代码

代码语言:javascript
复制
def action_required?
    true unless (self.nap_correct? && self.claimed? && self.duplicates == "")
end

在我看来,我有一个使用params过滤结果的链接。下面是代码

代码语言:javascript
复制
<%= link_to "All Messages", url_for(:action_required => true) %>

在我的控制器里

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

现在它给了我这个错误

代码语言:javascript
复制
SQLite3::SQLException: no such column: citations.action_required: SELECT "citations".* FROM "citations" WHERE "citations"."client_id" = ? AND "citations"."action_required" = 't'

这里我漏掉了什么?

EN

回答 1

Stack Overflow用户

发布于 2015-08-18 02:00:23

首先,您不需要编写true unless...,只需这样做

代码语言:javascript
复制
def action_required?
  self.nap_correct? && self.claimed? && self.duplicates == ""
end

然后将您的复杂条件转换为scope

代码语言:javascript
复制
scope :action_required, ->(){
  self.where(nap_correct: true, claimed: true, duplicated: '')
}

然后,您可以使用作用域:

代码语言:javascript
复制
@citations = @client.citations.action_required.paginate(:page =>[:page], :per_page => 50).order(id: :desc)

如果您的#nap_correct?claimed?方法也是复杂的Ruby方法,并且不仅仅是模型中的字段,那么您也需要将它们提取到SQL中(例如,创建scopes)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32056765

复制
相关文章

相似问题

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