mysql - Controller 中的 Rails where 或子句

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

<分区>

我正在尝试使用 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

||(逻辑或运算符)将查看第一个表达式的值,如果它存在,即它不是 nilfalse,然后将返回值。如果不是,那么它只会转到下一个表达式进行评估。这就是为什么您会看到预期的行为。参见 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

关于mysql - Controller 中的 Rails where 或子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600591/

相关文章:

mysql - 连接具有不同列名和相同行的两个表

php - 同一路径(分支)内的最短字符串

ruby-on-rails - Rails : ActiveAdmin sort by index, 然后通过自定义方法值

ruby-on-rails - 快速帮助重构 Ruby 类

ruby-on-rails - 在 Ruby on Rails 模型对象上执行 map 方法

ruby-on-rails - 记录 Rails 应用程序中的所有方法调用

mysql - 将逗号分隔列表与 SQL 语句中的输入匹配

php - 通过 JOIN 在单个查询中查询多个表

mysql - 是什么迫使我的系统在 "/opt/local/var/run/mysqld/mysqld.sock"中查找 MySQL

ruby-on-rails - 为什么我的小数点从数据库出来后稍微大一点?