Rails控制器中的where或clause

时间:2015-11-09 00:09:51

标签: mysql ruby-on-rails ruby activerecord rails-activerecord

我试图在控制器中使用where或子句指定索引视图。现在,代码只返回||之前的条件,如果它找到了。

我的代码:

  def index
    @trades = Trade.where(grower_id: session[:user_id]) || 
    Trade.where(consumer_id: session[:user_id])
  end

我试过了:

@trades = Trade.where(grower_id: session[:user_id]).or(Trade.where(consumer_id: session[:user_id]))

@trades = Trade.where(grower_id: session[:user_id])  ||=(Trade.where(consumer_id: session[:user_id]))

我还检查了this response,但这些建议无效。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

Active Record Query不支持Rails 4中的or子句。但是,it's coming in Rails 5。如果您想在or应用程序中使用>= Rails 4.2子句进行Active Record查询,可以使用where-or gem。然后,您可以像这样进行Active Record查询:

@trades = Trade.where(grower_id: session[:user_id]).or(Trade.where(consumer_id: session[:user_id]))

解释此代码的行为:

  def index
    @trades = Trade.where(grower_id: session[:user_id]) || 
    Trade.where(consumer_id: session[:user_id])
  end

||(逻辑或运算符)将查看第一个表达式的值,如果它存在,即它不是nilfalse,然后将返回值。如果没有,则只进入下一个要评估的表达式。这就是为什么你会看到预期的行为。有关逻辑或运算符(||)如何工作的更多详细信息,请参阅this post

现在,要解决您的问题,您可以使用SQL重新编写查询:

def index
  @trades = Trade.where('trades.grower_id = ? OR trades.consumer_id = ?', session[:user_id], session[:user_id])
end

作为评论部分中指出的mu is too short,为了避免代码中的重复,您也可以这样编写查询:

def index
  @trades = Trade.where('trades.grower_id = :user_id OR trades.consumer_id = :user_id', user_id: session[:user_id])
end