如何解决从ActiveRecord :: Relation中删除“ where”子句
|| 我在User上有一个类方法,该方法对User应用一个复杂的select / join / order / limit并返回该关系。它还应用了“ 0”子句。如果我有那个关系对象,是否可以删除这一特定的“ 1”语句? 就像是User.complex_stuff.without_where(:admin => true)
解决方法
您可以执行类似的操作(
where_values
保存每个where
查询;您必须对SQL进行调整以匹配系统上the5ѭ的确切输出)。请记住,这仅在您尚未实际执行查询时才有效(即,您尚未在其上调用.all
或在视图中使用其结果):
@users = User.complex_stuff
@users.where_values.delete_if { |query| query.to_sql == \"\\\"users\\\".\\\"admin\\\" = \'t\'\" }
但是,我强烈建议您使用Emily的答案来重组complex_stuff
方法。
, 我知道这是一个老问题,但是由于Rails 4现在您可以执行此操作
User.complex_stuff.unscope(where: :admin)
如果您想无条件地取消对整个where
部分的范围检查,这将删除查询的where admin部分。
User.complex_stuff.unscope(:where)
ps:感谢@Samuel指出我的错误
, 我还没有找到一种方法来做到这一点。最好的解决方案可能是重组现有的“ 8”方法。
首先,创建一个新的方法complex_stuff_without_admin
,该方法可以完成ѭ8everything的所有工作,但不添加where(:admin => true)
。然后重写complex_stuff
方法以调用User.complex_stuff_without_admin.where(:admin => true)
。
基本上,只需从另一侧进行处理即可。在需要的地方添加,而不是在不需要的地方删除。
, 我需要在连接两个合并范围时执行此操作(由合并范围创建的“ѭ18”),并按以下方式进行操作:“19ѭ”。
我想加入组成\'joined_scope \'的两个范围的值而没有\'where \'子句的值,以便我可以单独添加更改的\'where \'子句(改为使用\'OR \' \'AND \')。
对我来说,这进入了合并范围,就像这样:
scope :joined_scope,-> (from,to) {
joins(self.first_scope(from,to).values[:joins])
.joins(self.other_scope(from,to).values[:joins])
.where(first_scope(from,to).ast.cores.last.wheres.inject{|ws,w| (ws &&= ws.and(w)) || w}
.or(other_scope(from,to).ast.cores.last.wheres.last))
}
希望对某人有帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。