Rails - 如何合并两个对象并仅保留重复?

时间:2015-12-18 21:07:34

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

scope1 = User.where(:last_name => 'green')
scope2 = User.where(:last_name => 'mayer')
merged_scope = scope1.merge(scope2)

merged_scope 中,将使用姓氏为绿色 mayer 的用户。但是,让我们假设以下情况:

scope1
-
peter green
mark green
joe green

scope2
-
caleb mayer
mark mayer
caroline mayer

我正试图进入 merged_scope 仅与 first_name 相同的记录。说到这个具体案例,那么在 merged_scope 中将是:

 mark green
 mark mayer

如何做这样的事情?

谢谢

修改

这是一个简化的例子,查询更复杂,我需要它们单独生成(在上面的例子中,它可以在一个查询中生成)。

2 个答案:

答案 0 :(得分:1)

可能有更好的方法,但我的第一个想法是......

scope0 = User.where(last_name: 'green')
scope2 = User.where(last_name: 'mayer', first_name: scope0.map(&:first_name))
scope1 = User.where(last_name: 'green', first_name: scope2.map(&:first_mame))
merged_scope = scope1.merge(scope2)

提取所有'绿色' 映射“绿色”范围中的所有first_name列 从第一个范围中提取名字在first_name数组中的所有'mayer', 提取所有'green'(再次),这次firs tname位于第二个范围的first_name数组中。

结果是两个范围,一个用于'mayer'一个用于'green',其中每个范围中的记录的第一个名称必须作为另一个范围中的第一个naemes存在

答案 1 :(得分:1)

您可以尝试这个棘手的问题:

last_names = ["green", "mayer"]
User.joins("INNER JOIN users another ON another.last_name != users.last_name 
            AND users.first_name = another.first_name").
     where(last_name: last_names, another: { last_name: last_names })