我有一张桌子,我们称之为Widget。
我做了一些复杂的处理来获取各种类型的小部件。这些最终有两个不同的变量。
为了简单起见,假设我们有......
widgetsA = Widget.where("blah blah blah")
widgetsB = Widget.where("blah blah blah blah")
我们仍然可以在widgetsA
和widgetsB
上执行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...
答案 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
集合,其中包含widgetsA
和widgetsB
中的所有元素,并允许进一步激活记录范围。