我正在尝试在我的 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/