我正在尝试使用 where 或子句在我的 Controller 中指定索引 View 。现在,代码只返回 || 之前的条件,如果它找到的话。
我的代码:
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 ,但这些建议不起作用。
如有任何帮助,我们将不胜感激!
Active Record Query 不支持 Rails 4 中的 or
子句。但是,it's coming in Rails 5 .如果您想在 >= Rails 4.2
应用程序中使用 or
子句进行 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太短
在评论区指出,为了避免代码重复,你也可以这样写query:
def index
@trades = Trade.where('trades.grower_id = :user_id OR trades.consumer_id = :user_id', user_id: session[:user_id])
end