如何将2个activerecord记录合并在一起并保留1?轨道

时间:2017-06-22 15:29:23

标签: ruby-on-rails

我有2个苹果:

{
 id: 1,
 rotten: true,
 branch_on_tree: nil,
 type: "red delicious"
},
{
 id: 2,
 rotten: nil,
 branch_on_tree: 5,
 type: "red delicious"
}

它们是重复的苹果红色美味。如何将记录合并在一起然后删除缺少数据的记录?有没有方便的方法呢?

注意:可能有10个重复项。我不想在我的最终记录中有任何空值。非空值优先。

2 个答案:

答案 0 :(得分:1)

不是很方便,但它会起作用

假设苹果是一个数组:

[
  {
   id: 1,
   rotten: true,
   branch_on_tree: nil,
   type: "red delicious"
  },
  # ...
]

可以来自:

apples = Apple.where(type: "red delicious")
apples_attrs = apples.map(&:attributes)

然后,

apple_attrs = apples_attrs.reduce do |apple, next_apple| 
                apple.merge(next_apple) do |_, old_value, new_value| 
                  old_value || new_value
                end
              end


apples.destroy_all
Apple.create(apple_attrs)

您可能需要查看本指南https://apidock.com/ruby/Hash/merge

答案 1 :(得分:0)

假设type始终具有某些值,您可以将DISTINCTwhere子句一起使用。以下应该有效

Apple.where('rotten IS NOT NULL AND branch_on_tree IS NOT NULL').select('DISTINCT ON (type) rotten,branch_on_tree,type').take