2017-09-15 78 views
0

我有兩個型號的ActiveRecord:聯盟 - 紅寶石

class M1< ActiveRecord::Base 

end 

class M2< ActiveRecord::Base 

end 

它們都具有相同的結構,他們有namedateinfo屬性。 我創建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

應該已經工作。你得到了什麼錯誤或結果? – SteveTurczyn

+0

@ user2950593如果我正確地理解了你的目標,你應該只需要把m_all = m_all.uniq放進去呢? –

+0

@SteveTurczyn結果是相同的數組前後具有相同數量的元素 – user2950593

回答

0

如果我正確理解你的要求,你需要使用pluck

如:

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

m_all = (m1s + m2s).uniq 

樣品O/P

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

注意:我試圖在評論中提出它,但由於它在那裏是不可讀的,我將它作爲答案發布。

編輯

如果需要使用密鑰信息,使用select

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

m_all = (m1s + m2s).uniq 

樣品O/P

[{date: "11.04.15", name: "xxx", info: ""}, 
{date: "11.04.15", name: "yyy", info: ""}] 
1

我嘗試了一個示例數據庫,其中上我是,和uniq代碼工作正常。你確定date是日期字段嗎?如果這是一個日期時間字段,您可能會發現匹配失敗。

嘗試使用此方法只配上年月日(我也建議to_date但我偶爾有與問題)

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