2017-09-15 2 views
0

は、私は2つのActiveRecordのモデルを持っています。連合ルビー

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

今、私は彼らの組合への一つの方法または別のをしたい: 私は2つのクエリを作成しました。

だから私はそれ簡単なん:

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="11.04.15" name="xxx" info ="" 
    date="11.04.15" name="yyy" info ="" 
    date="11.04.15" name="yyy" info = "" 

それはので、それらの最初の2つだけを選択する必要があります。言い換えれば、私は3つのレコードを持っている場合たとえば、date同じとname

同じを持って繰り返しオブジェクトを、必要はありません。 2番目と3番目の日付と名前は同じです。

どうすればいいですか? 私はこのようにそれを行うにはなく、うまくいきませんでした試みた:

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", ""]] 

注:私はコメントでそれを示そうとしましたが、読めないので答えとして投稿しました。

EDIT

あなたがキーで情報が必要な場合は、使用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