我试图在控制器中使用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,但这些建议无效。
非常感谢任何帮助!
答案 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
||
(逻辑或运算符)将查看第一个表达式的值,如果它存在,即它不是nil
或false
,然后将返回值。如果没有,则只进入下一个要评估的表达式。这就是为什么你会看到预期的行为。有关逻辑或运算符(||
)如何工作的更多详细信息,请参阅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