具有必须唯一属性的两个对象数组的联合 - ruby

时间:2017-09-15 14:28:49

标签: ruby-on-rails ruby

我有两个activerecord模型:

 class M1< ActiveRecord::Base

 end

 class M2< ActiveRecord::Base

 end

它们都具有相同的结构,具有namedate以及info属性。 我创建了2个查询:

m1s = M1.where(...)
m2s = M2.where(...)

现在我想以这种或那种方式结合它们。

所以我这么简单:

m_all=m1s + m2s

所以我得到了一个对象数组:

    [#<M1:0x007fffdcc14100
      date: Fri, 15 Sep 2017,
      name: "name1",
      info: "blablablabla">,

     #<M2:0x007fffdd492e08
      date: Fri, 15 Sep 2017,
      name: "name2",
      info: "blabla"> ...
   ]

现在从这个数组中,我需要选择对象,在哪里 (date, name) - 日期和名称属性的组合是唯一的。换句话说,我不需要重复的对象,它们具有相同的date和相同的name

例如,如果我有3条记录:

 date="11.04.15" name="xxx" info =""
  date="11.04.15" name="yyy" info =""
  date="11.04.15" name="yyy" info = ""

它应该只选择前两个,因为第二个和第三个具有相同的日期和名称。

那我该怎么办? 我试着像这样做,但没有工作:

m_all= m_all.uniq do |m|
   [m[:date], m[:name]]
end

2 个答案:

答案 0 :(得分:1)

我在我所在的示例数据库上尝试过,uniq代码运行正常。你绝对相信date是一个日期字段吗?如果它是一个日期时间字段,您可能会发现匹配失败。

尝试此选项仅在年月日匹配(我还建议to_date,但我偶尔会遇到问题)

m_all= m_all.uniq do |m|
   [m[:date].to_datetime.strftime('%Y%m%d'), m[:name]]
end

答案 1 :(得分:0)

如果我理解您的要求,则需要使用pluck

例如:

</a>

样本O / P

m1s = M1.where(...).pluck(:date, :name, :info)
m2s = M2.where(...).pluck(:date, :name, :info)

m_all = (m1s + m2s).uniq

注意:我试图在评论中提出建议,但由于它在那里不可读,我将其作为答案发布。

修改

如果您需要使用密钥的信息,请使用select

[["11.04.15", "xxx", ""], ["11.04.15", "yyy", ""]]

样本O / P

m1s = M1.where(...).select(:date, :name, :info).as_json
m2s = M2.where(...).select(:date, :name, :info).as_json

m_all = (m1s + m2s).uniq