我有两个activerecord模型:
class M1< ActiveRecord::Base
end
class M2< ActiveRecord::Base
end
它们都具有相同的结构,具有name
和date
以及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
答案 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