我如何查询Ruby数组,就像我使用Rails ActiveRecord一样?

时间:2015-05-26 22:14:49

标签: ruby-on-rails ruby activerecord

我有一张桌子,我们称之为Widget。

我做了一些复杂的处理来获取各种类型的小部件。这些最终有两个不同的变量。

为了简单起见,假设我们有......

widgetsA = Widget.where("blah blah blah")
widgetsB = Widget.where("blah blah blah blah")

我们仍然可以在widgetsAwidgetsB上执行ActiveRecord功能,例如.where。

现在,在检索A和B的集合之后,我需要将它们联合起来,然后对它们执行其他的ActiveRecord函数。

我想做这样的事......

widgetsAll = widgetsA | widgetsB
widgetsAll = widgetsAll.order("RANDOM()")
widgetsAll = widgetsAll.where(answers_count: 0).limit(10) + widgetsAll.where("answers_count > 0").limit(10)

这将采用A& A中找到的所有小部件(联合)。 B,随机化它们,然后选择10和答案,10选择没有答案。

问题是,我不能用户.order和widgetsAll不再是ActiveRecord对象,但由于widgetsAll = widgetsA | widgetsB行,它是一个数组。我该如何

A)将两个ActiveRecord集合联合/交叉到ActiveRecord集合

B)如何在数组上订购和执行'where'样式查询。

要么解决问题。我假设B对性能有点好,所以我认为这将是更好的答案。

有什么想法吗?

最后,假设Widget表格中包含 id 名称说明列。最后,我们想要一切的ActiveRecord或Array(可能是首选)。

编辑 :(尝试通过SQL UNION组合......但无法正常工作)

w1 = Widget.where("id = 1 OR id = 2")
w2 = Widget.where("id = 2 OR id = 3")
w3 = Widget.from("(#{w1.to_sql} UNION #{w2.to_sql})")

PG::SyntaxError: ERROR:  subquery in FROM must have an alias
LINE 1: SELECT "widgets".* FROM (SELECT "widgets".* FROM "widge...

3 个答案:

答案 0 :(得分:2)

我看到两个选项:

1)在SQL中执行联合:而不是返回数组的widgetsA | widgetsB,而不是在数据库中执行联合,因此结果仍然是关系对象:

Widget.from("(#{widgetA.to_sql} UNION #{widgetB.to_sql}) AS widgets")

2)使用普通数组方法。你的例子:

widgetsAll = widgetsAll.order("RANDOM()")
widgetsAll = widgetsAll.where(answers_count: 0).limit(10) + widgetsAll.where("answers_count > 0").limit(10)

会转换成这样的东西:

widgetsAll = widgetsAll.shuffle
widgetsAll = widgetsAll.select { |answer| widget.answer_count == 0 }.take(10) + 
             widgetsAll.select { |answer| widget.answers_count > 0).take(10)

详细了解Ruby arrays

答案 1 :(得分:1)

使用你可以做的any_of gem:

widgetsAll = Widget.where.any_of(widgetsA, widgetsB)

答案 2 :(得分:-1)

一种方法是按如下方式进行:

widgetsAllActual = Widget.where(id: widgetsAll)

这是创建一个新的Widget::ActiveRecord_Relation集合,其中包含widgetsAwidgetsB中的所有元素,并允许进一步激活记录范围。

参考:https://stackoverflow.com/a/24448317/429758