Ruby on rails 从ActiveRecord::关系中删除“where”子句

Ruby on rails 从ActiveRecord::关系中删除“where”子句,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我在User上有一个类方法,它返回将复杂的select/join/order/limit应用于User,并返回关系。它还应用where:admin=>true子句。如果我有关系对象,是否可以删除这个特定的where语句 差不多 User.complex_stuff.without_where(:admin => true) 我还没有找到一个方法来做这件事。最好的解决方案可能是重新构造现有的复杂方法 首先,创建一个新方法complex_stuff_而不使用_admin,该方法执行compl

我在User上有一个类方法,它返回将复杂的select/join/order/limit应用于User,并返回关系。它还应用where:admin=>true子句。如果我有关系对象,是否可以删除这个特定的where语句

差不多

User.complex_stuff.without_where(:admin => true)

我还没有找到一个方法来做这件事。最好的解决方案可能是重新构造现有的复杂方法

首先,创建一个新方法complex_stuff_而不使用_admin,该方法执行complex_stuff所做的一切,除了添加where:admin=>true。然后重写complex_stuff方法,调用User.complex_stuff_而不调用_admin.where:admin=>true


基本上,只需从另一边接近它。在需要的地方添加,而不是删除不需要的地方。

您可以这样做,其中\u值保存每个where查询;您必须调整SQL以匹配系统上的:admin=>true的精确输出。请记住,只有在您尚未实际执行查询的情况下,也就是说,您尚未调用该查询的所有内容,或在视图中使用其结果时,此操作才会起作用:

@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指出我的错误

我需要这样做,从连接两个作用域时由作用域创建的ActiveRecord::Relation中删除一个“where”子句,并这样做:self.scopefrom,to.values[:joins]

我想将组成“joined_scope”的两个作用域中的值连接起来,而不使用“where”子句,这样我就可以添加经过修改的“where”子句,分别修改为使用“或”而不是“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))
}

希望这能帮助别人这是一个古老的问题,它不能回答每个人所说的问题,但它是存在的

从文件中:

允许您更改给定属性先前设置的where条件,而不是附加到该条件

比如:

Person.where(name: "John Smith", status: "live").rewhere(name: "DickieBoy")
将输出:

SELECT `people`.* FROM `people` WHERE `people`.`name` = 'DickieBoy' AND `people`.`status` = 'live';
关键是名称列已被覆盖,但状态列仍保留