在活动的Record / Ruby on Rails框架中使用“OR”连接子查询

时间:2015-07-03 13:05:21

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

您好我很难创建特定的查询。

我有一个带有输入参数“{search}”的搜索字段。我想使用这个搜索字段来查找所有具有特定风味或描述的蔬菜的盘子。

我已经有了一个棘手的查询,它确实完成了它应该做的事情 - 所以这完全没问题!

Tables.where(id: Plate.select("plate_id").where(Veggie.select("id").where('description LIKE ? OR flavor LIKE ?', "%#{search}%","%#{search}%")))

除了Veggies之外,假设还有一个SQL-Table calles Fruits。现在我想搜索所有具有素食的板子,或者(!!!)水果适合搜索域输入的描述或味道。

我经常试验但找不到合适的方法。 这是我的一个实验,虽然不起作用:

Tables.where(id: Plate.select("plate_id").where((Veggie.select("id").where('description LIKE ? OR flavor LIKE ?', "%#{search}%","%#{search}%")).or(Fruit.select("id").where('color LIKE ? OR flavor LIKE ?', "%#{search}%","%#{search}%")))

上面的代码不起作用!问题是,我无法弄清楚如何组合这两个子查询。 or语句似乎不起作用。任何帮助表示赞赏。

编辑: 正如已经指出的那样,我现在尝试使用UNION命令。不幸的是,带有Gem active_record_union的.union()选项似乎只适用于rails 4 +。

所以我使用以下代码模拟了一个联合。

def self.search2(search2)
 if search2
  if search2.length > 0
    @Plate1 = Plate.where(veggie_id: Veggie.select("id").where('description LIKE ? OR color LIKE ?', "%#{search2}%","%#{search2}%"))
    @Plate2 = Plate.where(fruit_id: Fruit.select("id").where('description LIKE ? OR color LIKE ? OR flavor LIKE ?', "%#{search2}%","%#{search2}%", "%#{search2}%" ))
    @Plate12 = @Plate1+@Plate2
    @table_ids = Array.new
    @Plate12.each do |plate|
    @table_ids.push(plate.table_id)
   end
   where(id: @table_ids)
  else
   scoped
  end
 else
  scoped
 end
end

实际上,我确实认为这非常混乱!它按预期工作,但我很沮丧它有点慢和无法使用。如果有人有更好的建议,我很乐意提供任何帮助。

0 个答案:

没有答案