2016-01-29 27 views
0

我有db表中的記錄,只能通過id和創建/更新時間不同。我怎樣才能得到唯一的記錄? 我試過這種方法,但它沒有工作:如何從兩個相同的記錄中只獲取一個數據庫記錄?

msg_to_user = user.messages.new_messages.uniq 

我會解釋。用戶可以手動關注帖子,但同一帖子可以自動跟隨用戶。因此,如果帖子被某人評論,我只想發送一條消息。

1747 test message TamadaTours 12 new 2016-01-29 06:14:04.736869 2016-01-29 06:48:55.948529 32964382 
1748 test message TamadaTours 12 new 2016-01-29 06:14:04.741184 2016-01-29 06:48:55.951371 32964382 
+1

記錄是不相等的,因爲ID值不同。這是ORM的有效觀點。如果您只需要知道除ID之外的字段,則使用帶有DISTINCT的自定義SELECT。 – sschmeck

回答

1

數據庫中的所有記錄都是uniq(至少因爲ID列,默認情況下它具有uniq約束)。

您可能需要使用DISTINCT

Model.select('DISTINCT column_name1, column_name2') 
+0

但如果我想獲取記錄的所有字段呢? – nobilik

+1

@nobilik那麼什麼是uniq標準呢? –

+0

'Model.select('DISTINCT comment_id,group_id')' - 它將只返回這兩個字段,對嗎?但我需要這個記錄的所有領域。它可以有更多的記錄與相同的comment_ids和group_ids,但我只需要一個! – nobilik

0

您還可以在查詢中使用GROUP BY這樣

Model.all.group("column_name") 
+1

非常糟糕的主意使用'.all' –

+0

如果你真的想要得到的只有1記錄你甚至都不需要使用不同的/分組,只要使用。首先,和你做。 – Lymuel

0

一種來提取數據,但擺脫了ORM上下文的方式。

# maps every record to hash, remove the ID entry and then removes duplicates 
msg_to_user = user.messages.new_messages.attributes.map { |e| e.except('ID') }.uniq 
1

你的問題是有缺陷的......

具有id的點... ...否則稱爲primary_key ......在關係數據庫是爲了讓您能夠積極識別獨特記錄你想要:

主鍵唯一指定一個表內的元組。爲了一個屬性是一個很好的主鍵是不能重複


當你寫......「我怎樣才能得到只有唯一的記錄」 ......答案是唯一的拉記錄基於他們的id

如果細化到你真的想你的問題...

我想送只有一個消息後是否已有人評論

-

換句話說,你想拉一個獨特的user_ids(無重複)的集合,你可以發送新消息?

要做到這一點,你可以使用...

@recipients = Message.select(:user_id).distinct #-> all unique user_ids 

如果你想拉「新」的消息給用戶,但只顯示前(如果它們是相同的),你要使用類似以下內容:

@msg_to_user = user.messages.new_messages.uniq(:title) 

Ref


一個更好的模式來實現將是驗證新的消息的獨特性:

#app/models/message.rb 
class Message < ActiveRecord::Base 
    validates :user_id, uniqueness: { scope: :message_id } #-> replace message_id with other unique identifier 
end 

這將確保只有一個新的消息是存在用於一個用戶。

+0

目前另一個答案爲我做了這項工作。但你的答案是我應該考慮的問題!後來我會改變我的數據庫架構。 – nobilik

相關問題